歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Linux操作系統下動態庫的生成及鏈接方法

  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。




Copyright © Linux教程網 All Rights Reserved