當前位置:才華齋>計算機>作業系統>

Linux系統下動態庫的生成介紹

作業系統 閱讀(2.06W)

什麼是動態庫?

Linux系統下動態庫的生成介紹

動態庫又稱動態連結庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程式同時使用的程式碼和資料的庫,DLL不是可執行檔案。動態連結提供了一種方法,使程序可以呼叫不屬於其可執行程式碼的函式。函式的可執行程式碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的程序分開儲存的函式。DLL 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個DLL 副本的內容。DLL 是一個包含可由多個程式同時使用的程式碼和資料的庫。

一、簡述

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

小編綜合自己學習體會以及網路上較好的內容,以簡單的例子介紹動態庫檔案的生成和連結方法。

作業系統:Ubuntu 14.0.4

GCC版本:4.1.3

二、庫檔案及測試檔案程式碼

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

1、 庫檔名:myLibSrc.c

/*

filename: myLibSrc.c

*/

#include

#include"myLibInclude.h"

int

myLibSrcFun(){

printf("There is myLibSrcFun()n");

return 0;

}

2、 測試檔案:main.c

/*

filename: main.c

*/

#include

#include"myLibInclude.h"

int main(intargc, char** argv){

printf("Main function !n");

//呼叫載入的動態庫裡的函式

myLibSrcFun();

return 0;

}

3、 標頭檔案:myLibInclude.h

/*

filename: myLibInclude.h

*/

intmyLibSrcFun();//宣告一下函式

三、動態庫的編譯方法

編譯庫檔案 myLibSrc.c 命令如下:

$ gcc myLibSrc.c -shared -o

或是:$ gcc myLibSrc.c -fpic-shared -g -DDEBUG -o

如果編譯成功,會在目錄/home/test/program/ 下生成動態庫檔案:

這裡有兩點需要補充說明:

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

B、 編譯生成動態庫時的引數含義

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

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

四、動態庫的測試方法

編譯測試檔案:main.c

$gcc–o app main.c /home/test/program/

編譯成功後執行 ./app :

Main function !

There is myLibSrcFun()

需要注意的是:

1、上面編譯的命令 $gcc –o app main.c /home/test/program/

的最後一個引數是指定特定所連線庫檔案的絕對路徑。本例中的'庫檔案的絕對路徑即為/home/test/program/

當然,如果想從系統的庫檔案路徑(通常系統函式庫都位於 /usr/lib 目錄下)連結動態庫的話,可以先將生成的 庫檔案 拷貝至 /usr/lib下,然後在連結:

$cp /usr/lib/

$gcc –o app main.c -lmyLib

這裡,對於連結的方法做一下簡單的解釋:對於$ gcc –o app main.c -lmyLib 中的最後一個引數 –lmyLib ,可見傳遞給C的編譯器的命令列引數並未提到函式庫的完整路徑,甚至沒有提到在函式庫目錄 中該檔案的完整名字!實際上,編譯器被告知根據選項 -lmyLib 連結到相應的函式庫(/usr/lib 下),函式庫的名字是 ,也就是說,“lib”部分和檔案的副檔名都被省略了,但在前面加了一個 ‘l’.