動態庫的生成和鏈結方法

2021-07-30 11:17:40 字數 1812 閱讀 8820

linux下動態庫檔案的擴充套件名為".so"(shared object)。按照約定,所有動態庫檔名的形式是libname.so(可能在名字中加入版本號)。這樣,執行緒函式庫被稱作libthread.so。靜態庫的檔名形式是libname.a。共享archive的檔名形式是libname.sa。共享archive只是一種過渡形式,幫助人們從靜態庫轉變到動態庫。 

作業系統:debian/gnu linux 2.6.21-2-686; 

gcc版本:4.1.3 

一、庫檔案及測試檔案** 

庫檔案及測試檔案所在的目錄:/home/program/。 

1.庫檔名:myfunction.c 

/*author: godbach 

e-mail: [email protected] 

*/ #include 

int 

my_lib_function (void) 

2.測試檔名:test.c 

#include 

int main(void) 

二、動態庫的編譯方法 

編譯庫檔案myfunction.c: 

debian:/home/program# gcc -shared -o libmyfunction.so myfunction.c 

如果編譯成功,會在/home/program/下生成動態庫檔案:libmyfunction.so。 

這裡有兩點需要說明: 

1.對linux操作,一般都推薦在普通使用者模式下,如果需要超級使用者的許可權,則可以通過su root,輸入root使用者密碼切換。我是個人學習使用,同時又有很多的操作都要使用root使用者,因此就直接在root使用者下進行編譯。 

2.編譯生成動態庫的命令為:gcc (-fpic) -shared -o libmyfunction.so myfunction.c 

-fpic 使輸出的物件模組是按照可重定位位址方式生成的。 

-shared指定把對應的原始檔生成對應的動態鏈結庫檔案。 

三、動態庫的測試方法 

編譯測試檔案test.c: 

debian:/home/program# gcc -o test test.c /home/program/libmyfunction.so 

成功編譯後,生成test檔案,執行test: 

debian:/home/program# ./test 

library routine called from libmyfunction.so! 

其中,gcc -o test test.c /home/program/libmyfunction.so的最後乙個引數指定所鏈結庫檔案的絕對路徑。本例中庫檔案的絕對路徑為:/home/program/libmyfunction.so。 

debian:/home/program# cp libmyfunction.so /usr/lib/ 

debian:/home/program# gcc -o test test.c -lmyfunction 

debian:/home/program# ./test 

library routine called from libmyfunction.so! 

這裡,對於鏈結的方法作一下解釋。對於gcc -o test test.c -lmyfunction中最後乙個引數-lmyfunction, 可見傳給c編譯器的命令列引數並未提到函式庫的完整路徑名,甚至沒有提到在函式庫目錄中該檔案的完整名字!實際上,編譯器被告知根據選項-lmyfunction鏈結到相應的函式庫(/usr/lib下),函式庫的名字是libmyfunction.so, 也就是說,"lib"部分和檔案的副檔名被省略了,但在前面加了乙個l。

gcc動態庫與動態庫生成和鏈結

一般是建立共享庫的命令如下 gcc fpic c foo.c o foo.o gcc fpic c bar.c o bar.o gcc shared foo.o bar.o o libz.so gcc main.c lz l.o main這樣生成的共享庫還差點意思,完整格式應該同時設定共享庫的son...

linux下動態庫的生成和鏈結

linux下動態庫的生成和鏈結 so 本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。windows和linux下都存在庫,但不同。靜態庫 a 檔案。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫 so,也叫共享庫 shared object 程式...

生成動態鏈結庫

fpic pic就是position independent code pic使.so檔案的 段變為真正意義上的共享 如果不加 fpic,則載入.so檔案的 段時,段引用的資料物件需要重定位,重定位會修改 段的內容,這就造成每個使用這個.so檔案 段的程序在核心裡都會生成這個.so檔案 段的copy...