Linux下的動態庫和靜態庫

2022-03-29 02:13:38 字數 1918 閱讀 4240

1、使用gcc建立和使用靜態庫 

(1)gcc –o mylib.o –c mylib.c  //生成o檔案

(2)ar -rcs libmylib.a mylib.o   //生成a檔案

-c create的意思

-r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。

(3)cp libmylib.a /usr/lib/       //拷貝到預設目錄

(4)編寫程式使用庫中的函式,需要包含相關的標頭檔案,即可用下面的方式進行編譯連線。

gcc –o test test.c -l. -lmylib

-l指定靜態函式庫的位置供查詢,注意l後面還有'.',表示靜態函式庫在本目錄下查詢。

-l則指定了靜態函式庫名,由於靜態函式庫的命名方式是lib***.a,其中的lib和.a忽略。

2、使用gcc建立和使用動態庫

(1)gcc –fpic –o mylib.o –c mylib.c

gcc –shared –o libtt.so mylib.o

-fpic 作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code),則產生的**中,沒有絕對位址,全部使用相對位址,故而**可以被載入器載入到記憶體的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被載入時,在記憶體的位置不是固定的。

-shared 作用於鏈結階段,實際傳遞給鏈結器ld,讓其新增作為共享庫所需要的額外描述資訊,去除共享庫所不需的資訊。

(2)也可以直接使用下面一條命令:

gcc –fpic –shared –o libtt.so mylib.c

(3)將動態庫拷貝到linux 的標準庫中,usr/local/lib 或者/usr/lib 或者/lib,使用ldconfig命令載入

cp libttt.so /usr/local/lib

(4) 編譯src 程式使用動態庫,隱式呼叫方法: 在編譯呼叫庫函式**時指明動態庫的位置及名字

gcc –o test test.c  ./usr/lib/libttt.so

(5)編譯src程式使用動態庫,顯示呼叫方法

顯式呼叫動態庫需要四個函式的支援, 函式 dlopen 開啟動態庫, 函式 dlsym 獲取動態庫中物件基址, 函式 dlerror 獲取顯式動態庫操作中的錯誤資訊, 函式 doclose 關閉動態庫.

#include

int main() 

pfunc = (void (*)())dlsym(phandle, "print"); // 獲取庫函式 print 的位址 

if(pfunc) 

pfunc(); 

else 

printf("can't find function print\n"); 

dlclose(phandle); // 關閉動態庫 

return 0; 

} gcc –o test test.c -lttt -l

此時會到系統目錄下去搜素libttt.so檔案,具體搜尋方法見下一節。

3、shell 搜尋動態庫路徑位置的兩種方法

(1) 使用命令匯入動態庫的路徑,命令如下:

export ld_library_path=dir (如/usr/local/lib)

(2) 在/etc/ld.so.conf 檔案中更增加一條,修改後用ldconfig 命令載入修改。

4、其他

(1)ldd命令可以檢視乙個可執行程式依賴的共享庫,

# ldd /bin/ln

=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2

=> /lib/ld- linux.so.2 (0×40000000)

可以看到ln命令依賴於libc庫和ld-linux庫

(2)看動態庫包含哪些定義用:

nm -d lib*.so

Linux下的動態庫和靜態庫

靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...

linux下的動態庫和靜態庫

1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...

linux下檢視動態庫和靜態庫

靜態庫用ar t yourfile 動態庫用 nm d yourfile 下面是ar和nm命令的一些引數說明 1.ar基本用法 ar命令可以用來建立 修改庫,也可以從庫中提出單個模組。庫是一單獨的檔案,裡面包含了按照特定的結構組織起來的其它的一些檔案 稱做此庫檔案的member 原始檔案的內容 模式...