使用和生成庫
基本概念
庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如:libhello.so libhello.a
為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如: libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so
使用庫
第一步要把源**編繹成目標**。以下面的**為例,生成上面用到的hello庫:
quote:
/* hello.c */
#include
void sayhello()
用gcc編繹該檔案,在編繹時可以使用任何全法的編繹引數,例如-g加入除錯**等:
quote:
gcc -c hello.c -o hello.o
1.連線成靜態庫
連線成靜態庫使用ar命令,其實ar是archive的意思
$ar cqs libhello.a hello.o
2.連線成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc -shared -wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立兩個符號連線:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
這樣乙個libhello的動態連線庫就生成了。最重要的是傳gcc -shared 引數使其生成是動態庫而不是普通執行程式。
-wl 表示後面的引數也就是-soname,libhello.so.1直接傳給聯結器ld進行處理。實際上,每乙個庫都有乙個soname,當聯結器發現它正 在查詢的程式庫中有這樣乙個名稱,聯結器便會將soname嵌入鏈結中的二進位制檔案內,而不是它正在執行的實際檔名,在程式執行期間,程式會查詢擁有 soname名字的檔案,而不是庫的檔名,換句話說,soname是庫的區分標誌。
這樣做的目的主要是允許系統中多個版本的庫檔案共存,習慣上在命名庫檔案的時候通常與soname相同
lib***x.so.major.minor
其中,***x是庫的名字,major是主版本號,minor 是次版本號
LINUX庫的使用與生成
使用和生成庫 基本概念 庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,...
linux 動態庫的生成與使用
linux 圖2.靜態鏈結與動態鏈結return a b 編譯動態庫 gcc shared o libadd.so add.c 生成 libadd.so 動態鏈結方法 在編譯程式時,指定要鏈結的庫檔案即可,此時呼叫共享庫只需要其標頭檔案即可。示例 test.c include include int...
linux 庫檔案 生成與使用
1 linux庫檔案分為靜態庫和動態庫兩種。靜態庫習慣以.a 結尾,而動態庫習慣以.so shared object 結尾。而且必須以lib開頭。2 靜態庫的原則是 以空間換時間 增加程式體積,減少執行時間 生成 在編譯時候,先生成目標檔案.o,然後用ar檔案對目標檔案歸檔,生成靜態庫檔案。例如 a...