加粗樣式
靜態庫檔案字尾為 **.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...