Linux 動態庫及靜態庫的建立使用

2021-10-16 19:41:20 字數 2138 閱讀 4369

加粗樣式

靜態庫檔案字尾為 **.a**,動態庫檔案字尾為**.so**本次以簡單的兩個函式的集合來描述這些庫的建立以及使用:

建立這樣幾個目錄:

**function headfile lib media outfile sourcecode**

作用從左至右分別是:

函式主體存放,標頭檔案存放,庫檔案存放,中間檔案存放,輸出檔案存放,主函式檔案存放

在**function**中建立這樣兩個檔案:**add.c sub.c**,分別輸出兩個數的和和差。

在**sourcecode**建立乙個 **test.c**,裡面新增函式宣告,以及例項,不需要給出標頭檔案,這些會在庫的建立中被代替對應的作用

一.  將所有的函式編譯為中間檔案:

gcc -c ./function/add.c -o ./media/add.o

gcc -c ./function/sub.c -o ./media/sub.o

二. 使用 ar 命令打包所有的中間檔案

ar -cr ./lib/libtest.a add.o sub.o

其中 libtest.a 是我自己命名的靜態庫檔名

要刪除庫檔案中某個函式,使用 **-d 你要刪除的中間檔案**

要新增的話,使用 -rs 引數用法和刪除的引數相同

例如:ar -d add.o

ar -rs add.o

三. 鏈結

gcc -c ./sourcecode/atest.c -o ./media/atest.o

這是將主函式檔案編譯為中間檔案,有利於後面的對接

gcc ./media/atest.o -l./lib -ltest -o ./outfile/atest.out

其中 -l 指定庫檔案所在根目錄,-l 指定庫檔案的名稱,我的庫檔案原名是 **libtest.a**,但在該引數後面變成了 **test** ,去除了前面的 **lib** 和後面的 **.a**,這是另乙個需要注意的地方。

四. 執行

./outfile/atest.out 即可得出結果

一.  建立可以重定位函式位址的中間檔案

gcc -c -fpic ./function/add.c -o ./media/add.o

gcc -c -fpic ./function/sub.c -o ./media/sub.o

這裡的引數 -fpic 就是給予中間檔案函式重定位的能力

二. 將這些中間檔案連線成乙個動態庫

gcc -shared ./media/add.o ./media/sub.o -o ./lib/libsotest.so

引數 -shared 就起到這個作用,後面的**libsotest.so**是我命名的動態庫檔名

三. 使用動態鏈結庫

gcc ./sourcecode/atest.c -s ./lib/libsotest.so -o ./outfile/sotest.out

動態庫使用時不需要把主函式檔案編譯為中間檔案,引數 -s 是使用該庫檔案;

四. 執行

./outfile/sotest.out

但是如果這樣直接執行,會發生錯誤,原因是載入共享庫(動態庫)的時候,找不到它,

因為系統預設從根目錄下的 **/lib** 去尋找,然後再用使用者的 **ld_library_path**變數值下去尋找,這時,我們應當更改該變數的值:

export ld_library_path=./lib/

完成之後你執行 echo 指令可以看到:

**echo $ld_library_path

./lib/**

此時你就可以直接執行 ./outfile/sotest.out 結果會正常出現

但是這是乙個臨時的辦法,當使用者重新登入的時候,又會出現問題,要解決他,在使用者的加目錄中 輸入 ll -a 命令,可以看到有乙個

-rw-r--r--. 1 wad wad 343 1月 20 02:44 **.bashrc** 檔案,編輯它,在裡面加上這樣的一句話:export ld_library_path=/home/wad/lib 就可以永久生效

其中 wad 是使用者的家目錄名。

linux庫及靜態庫及動態庫的建立

庫 庫是一組預先編譯好的函式的集合,這些函式都是按照可重用的原則編寫的。它們通常由一組相互關聯的函式組成以執行某項常見任務,比如螢幕處理函式庫和資料庫訪問例程。庫分為靜態和動態庫兩種,這裡先介紹一下靜態庫的建立。linux的庫一般在 lib或 usr lib目錄下。lib是庫 library 的英文...

Linux 靜態庫及動態庫

庫的製作和使用 什麼是庫 1 庫是二進位制 2 庫是加了密的源 3 庫是功能相近或者相似的函式的集合 庫的作用 1 的復用性,提高了軟體開發的效率,而且穩定安全.庫的製作 庫分為靜態庫和動態庫 庫的名字 libtest1.a 材料 main.c fun1.c fun2.c head.h main.c...

linux建立靜態庫和動態庫

2015新年第一篇部落格,哈哈,這個2月還沒寫過部落格呢,從現在開始繼續!一 建立靜態庫 在本例中將建立乙個小型靜態函式庫libfoo,包含兩個函式bill fred 1 編輯兩個檔案bill.c和fred.c bill.c include void bill fred.c include void...