LINUX庫的使用與生成

2021-04-30 13:10:45 字數 1294 閱讀 9863

使用和生成庫

基本概念

庫有動態與靜態兩種,動態通常用.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...