Linux 下動態庫和靜態庫的建立和呼叫

2021-09-09 02:57:59 字數 1799 閱讀 9470

每個程式實質上都會鏈結到乙個或者多個的庫。比如使用c函式的程式會鏈結到c執行時庫,gui程式會鏈結到視窗庫等等。無論哪種情況,你都會要決定是鏈結到靜態庫(static libary)還是動態庫(dynamic libary)。

鏈結到靜態庫會使你的程式臃腫,並且難以公升級,但是可能會比較容易部署。

而鏈結到動態庫會使你的程式輕便,並且易於公升級,但是會難以部署

最近寫的.c檔案比較大,先在決定生成乙個linux下面的庫,來呼叫我們編譯好的函式,這樣子的話我們的主函式就顯得比較簡潔不是很擁擠,好了下面是樣本例項。

檔案目錄:

/mnt/windows/linuxso/

檔案目錄下面的檔案:

test1().c test2.c main.c

檔案test1().c內容:

#include
#include
void hello()
void linuxso()
void parso(int a)
檔案test2().c內容:

#include
#include
void xmphoenix(int a)
else
printf("i cannot receive your command\n");
}
檔案main.c內容:

#include
#include
int main(int argc,char *ar**)
下面是具體的編譯流程:

靜態庫:

靜態庫也就相當於是把一系列的object檔案放在同乙個檔案中(類似windows中的.lib檔案)。當你提供乙個靜態庫給鏈結器時,聯結器將會搜尋靜態庫,從中找到他所需要的object檔案,提取出他們,將他們鏈結到你的程式中,就像你直接提供那些檔案一樣。

cr標誌告訴ar將object檔案封裝(archive),我們可以使用nm -s 命令來檢視.a檔案的內容;

-l指定了lib的搜尋路徑,-l指定了鏈結的庫的名字-ltest也就是鏈結libtest.a

動態庫編譯和呼叫:

動 態庫(static lib)也可一也可以成為共享庫(shared lib),一般的字尾名是.so。動態庫與靜態庫有點類似,他們都是一系列的object檔案的集合,只是他們的組織方式不同。同樣他們的鏈結方式也是不 同的,動態庫只在執行是鏈結使用,並不把相應的部分編譯入程式中,在使用是乙個庫可以被多個程式使用故可稱為共享庫,而靜態庫將會整合到程式中,鏈結時各 程式使用自己的庫。

-fpic告訴gcc將源**編譯成共享的object檔案,pic(position-independent code)非位置依賴性**。

Linux下的動態庫和靜態庫

靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...

linux下的動態庫和靜態庫

1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...

Linux下的動態庫和靜態庫

1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...