靜態庫在程式編譯時間會被串連到目標代碼中,程式運行時將不再需要該靜態庫。
動態庫在程式編譯時間並不會被串連到目標代碼中,而是在程式運行是才被載入,因此在程式運行時還需要動態庫存在。
程式1: hello.h
#ifndef HELLO_H#define HELLO_Hvoid hello(const char *name);#endif //HELLO_H
程式2: hello.c
#include void hello(const char *name) { printf("Hello %s!\n", name); }
程式3: main.c
#include "hello.h" int main() { hello("everyone"); return 0; }
無論動態庫還是靜態庫都需要用到.o檔案來產生,先編譯產生.o檔案。
# gcc -c hello.c
1:建立靜態庫
靜態庫檔案名稱的命名規範是以lib為首碼,緊接著跟靜態庫名,副檔名為.a。例如:我們將建立的靜態庫名為myhello,則靜態庫檔案名稱就是libmyhello.a。
# ar cr libmyhello.a hello.o
使用靜態庫:只需要在你的來源程式中加入包含你所需要使用到的函數的聲明(即包含標頭檔),然後在gcc產生目標檔案時候指明靜態庫就OK了(除非你包含的標頭檔在/usr/include,庫檔案在標準庫/usr/lib,/lib下,否則你得顯示指明他們的路徑)
# gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone!
刪除靜態庫檔案運行./hello,程式正常運行,說明靜態庫公用函數已經連結到目標檔案。
2: 利用.o檔案建立動態庫
動態庫副檔名為.so。
# gcc -shared -fPCI -o libmyhello.so hello.o
動態庫的使用與靜態庫使用方式一樣
# gcc -o hello main.c -L. -lmyhello # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
哦!出錯了。快看看錯誤提示,原來是找不到動態庫檔案libmyhello.so。程式在運行時,會在/usr/lib和/lib等目錄中尋找需要的動態庫檔案。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程式運行。
如何找到產生的動態庫有3種方式:
1)把庫拷貝到/usr/lib和/lib目錄下。
2)在LD_LIBRARY_PATH環境變數中加上庫所在路徑。
例如動態庫libhello.so在/home/example/lib目錄下:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib
3) 修改/etc/ld.so.conf檔案,把庫所在的路徑加到檔案末尾,並執行ldconfig重新整理。這樣,加入的目錄下的所有庫檔案都可見。
當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。