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 <stdio.h>
int
my_lib_function (void)
{
printf ("Library routine called from libmyfunction.so!\n");
return 0;
}
2.測試文件名:test.c
#include <stdio.h>
int main(void)
{
my_lib_function();
return 0;
}
二、動態庫的編譯方法
編譯庫文件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。
當然,如果想從系統的庫文件路徑(通常系統函數庫的位於/usr/lib下)鏈接動態庫的話,可以先將生成的庫文件拷貝至/usr/lib/下,然後再鏈接:
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。