什麼是動態庫?
動態庫又稱動態連結庫英文為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’.