初識Linux · 動靜態(tài)庫(incomplete)

前言:

在前文中,我們從磁盤的理解,逐步構(gòu)建了文件系統(tǒng)框架,并探討了軟硬鏈接,逐漸理解了為什么運行程序需要使用./a.out,以及前面的點號的含義。

在文件權(quán)限部分,我們接觸了最基本的庫,了解到linux系統(tǒng)中動態(tài)庫的后綴是.so,靜態(tài)庫是.a,而windows系統(tǒng)中動態(tài)庫是.dll,靜態(tài)庫是.lib。我們也知道庫的名字需要去掉前綴和后綴,這是我們對庫的初步認(rèn)識。

那么,我們是否已經(jīng)使用過庫呢?

當(dāng)然是使用過的。在使用c語言c++時,我們用到的頭文件就位于庫中,比如標(biāo)準(zhǔn)庫(std庫),我們肯定是用過的。那么,庫的作用是什么呢?

在STL容器中,都有基本函數(shù)的接口,比如vector的push_back,我們使用的是這些接口,那么具體的實現(xiàn)又在哪里呢?

具體的實現(xiàn)肯定是放在.cc文件中,通過編譯器編譯成.o文件,然后這些文件被合并,形成了最終的庫。

現(xiàn)在,我們就從“是什么”、“為什么”和“怎么辦”三個方面來討論靜態(tài)庫和動態(tài)庫。

靜態(tài)庫為了生成靜態(tài)庫,我們首先模擬實現(xiàn)多個.c文件和多個.h文件:

初識Linux · 動靜態(tài)庫(incomplete)

然后在這些文件中寫入對應(yīng)的代碼:

#pragma once int Sub(int x, int y); <h1>include "sub.h"</h1><p>int Sub(int x, int y) { return x - y; }</p><h1>include "add.h"</h1><p>int Add(int x, int y) { return x + y; }</p><h1>pragma once</h1><p>int Add(int x, int y);

我們創(chuàng)建了兩個.c文件和兩個.h文件。

然后我們在test.c文件中進(jìn)行測試:

#include <stdio.h></p><h1>include "add.h"</h1><h1>include "sub.h"</h1><p>int main() { printf("a + b = %dn", Add(10,20)); printf("a - b = %dn", Sub(10,20)); return 0; }

如果我們直接編譯,肯定是無法通過的,因為真正的實現(xiàn)是在.c文件中:

初識Linux · 動靜態(tài)庫(incomplete)

那么我們不妨先生成.o文件,為靜態(tài)庫做準(zhǔn)備:

初識Linux · 動靜態(tài)庫(incomplete)

然后使用ar命令生成靜態(tài)庫:

初識Linux · 動靜態(tài)庫(incomplete)

其中,replace是r,c是create,如果庫不存在則創(chuàng)建。

初識Linux · 動靜態(tài)庫(incomplete)

這是靜態(tài)庫的創(chuàng)建過程,libmyc.a就是我們創(chuàng)建的靜態(tài)庫,但實際上,myc才是這個靜態(tài)庫的名稱。

然而,對于庫的使用來說,比如C語言提供多個庫,我們都是通過#include 來使用的,編譯器會在安裝好的庫中查找,因此這里肯定存在路徑問題。

初識Linux · 動靜態(tài)庫(incomplete)

使用-L和-l選項可以解決這個問題。

動態(tài)庫的部分將在后續(xù)文章中介紹。

這里還涉及一些附加問題,將在后續(xù)更新中詳細(xì)討論。

感謝閱讀!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊6 分享