1、linux庫檔案分為靜態庫和動態庫兩種。靜態庫習慣以.a 結尾,而動態庫習慣以.so(shared object)結尾。而且必須以lib開頭。
2、靜態庫的原則是「以空間換時間」,增加程式體積,減少執行時間;
生成:在編譯時候,先生成目標檔案.o,然後用ar檔案對目標檔案歸檔,生成靜態庫檔案。
例如:ar -rc libtest.a myalib.o (注意:ar -rc 目標 .o檔名),目標一定要以lib開頭。
如:gcc -o main main.o -ltest
而且-ltest必須放在main.o的後面,(規則是,越底層的庫越要放在後面)。
4、gcc的其他常用的選項,
-c 編譯成目標檔案 如:gcc -c main.c 就是編譯main.c成目標檔案main.o
-i 標頭檔案的查詢路徑,如:gcc -c main.c -i./inc 意思是:標頭檔案的查詢路徑除了預設的之外,再加上./inc目錄下的。
-l 庫檔案的查詢路徑,如:gcc -o main main.o -l./lib -ltest 說明:libtest.a 或者 libtest.so 庫檔案的查詢路徑除了預設之外,再加上./lib目錄。
-mm 匯出檔案的依賴關係(用#include 中的內容)如:gcc -mm main.c找出main.c的所依賴的標頭檔案
-o 生成最終目標
-d巨集定義 相當於在c中些語句#define ... 如:-dpi=3.14 就相當於在檔案裡面寫語句#define pi 3.14
5、動態庫
gcc -o main main.o -l./lib -ltest(像靜態庫的一樣)
顯示使用就是在程式中用語句把動態庫調進來,用系統呼叫:dlopen、dlsym、dlerror、dlclose函式,那樣在編譯鏈結時候,不用加上:-l./lib -ltest了。不過要使用dl*系列函式在編譯鏈結時要加上 -ldl
6、如果同一目錄下,既有靜態庫也有動態庫,比如libtest.a libtest.so都存在,那麼dl程式(等一下介紹)就把動態庫調進去,沒有動態的,就找靜態的。再沒有,就報錯。
7、動態庫的搜尋路徑
dl對動態庫的搜尋路徑如下(按順序如下)
a.編譯目標**時指定的動態庫搜尋路徑;(如果要指定程式行時在./lib目錄下找庫檔案libtest.so,命令如下:gcc -o main main.c -l./lib -ltest -wl,-rpath ./lib) ,其中,-wl的意思是,後面的選項直接交給ld程式處理,-rpath選項是說更改搜尋路徑為後面的引數./lib
b.環境變數ld_library_path指定的動態庫搜尋路徑;
c.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;(修改完檔案後,用ldconfig更新)
d.預設的動態庫搜尋路徑/lib和/usr/lib;
8、一些常用的命令(與庫有關的)
(1)、ld 是gcc的鏈結程式。
(2)、ldd是檢視可執行檔案中所依賴的庫的程式,比如想查main程式用到了那些動態庫,可以直接
ldd main
(3)、ldconfig用來更新檔案/etc/ld.so.conf的修改生效。
(4)、nm用來檢視.so庫中的函式名字,標記是t的就是動態庫裡面生成的名字。如:nm /lib/libc*.so 頂
0
踩
linux 庫檔案 生成與使用
1 linux庫檔案分為靜態庫和動態庫兩種。靜態庫習慣以.a 結尾,而動態庫習慣以.so shared object 結尾。而且必須以lib開頭。2 靜態庫的原則是 以空間換時間 增加程式體積,減少執行時間 生成 在編譯時候,先生成目標檔案.o,然後用ar檔案對目標檔案歸檔,生成靜態庫檔案。例如 a...
linux 庫檔案 生成與使用
1 linux庫檔案分為靜態庫和動態庫兩種。靜態庫習慣以.a 結尾,而動態庫習慣以.so shared object 結尾。而且必須以lib開頭。2 靜態庫的原則是 以空間換時間 增加程式體積,減少執行時間 生成 在編譯時候,先生成目標檔案.o,然後用ar檔案對目標檔案歸檔,生成靜態庫檔案。例如 a...
LINUX庫的使用與生成
使用和生成庫 基本概念 庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,...