在程式開始執行時才載入。
1. 可減少執行檔的大小。
2. 更新程式庫而無需重新編譯其他程式。
3. 可在程式執行時更改程式庫。
每個library名稱大致上為 libxxx.so, 有時會加上版本如: libxxx.so.2.1
建立Shared Library:
首先要以-fPIC選項建立一object file,PIC(position-independent code),
是shared library必需使用的選項,這令shared library擁有自己的動態記憶體區塊
i.e. 它使用全域記憶體偏移量表(global offset table,GOT),
不受主程式的記憶體限制:
gcc -fPIC -c -Wall initapi.c
gcc -fPIC -c -Wall randapi.c
然後再將目的檔編譯成「.so」:
gcc -shared initapi.o randapi.o –o libmyrand2.so
Static Library - 靜態函式庫在程式編譯時,若使用static library的話,則library中的元件會連結到我們的執行檔中,此時執行檔的大小會比較大,但優點就是 當我們在執行程式時,就不需要再loading library。
每個library名稱大致上為 libxxx.a
製作Static Library:
步驟一 gcc -c -Wall initapi.c gcc -c -Wall randapi.c 步驟二 執行ar指令,將目的檔加入靜態函式庫中 ar –cru libmyrand.a initapi.o randapi.o 在執行上述指令後,會將initapi.o及randapi.o加入至libmyrand.a靜態函式庫中。 其中我們在ar指令中加入「-cru」的選項,這是建立或加入目的檔的標準作法, 選項c指定要建立靜態函式庫, 選項r告知ar取代其中已存在的目的檔, 選項u則為一個安全選項,它告知ar欲取代的目的檔必須比已存在的目的檔還新才行。p.s. 用「ldd 執行檔」指令可看執行檔在執行時所需要的shared library.
所以每當發生 /usr/bin/ld: cannot find -lxxx時,就是找不到此libxxx.so
安裝此lib就可解決,除非另一種狀況是用
whereis libxxx.so
指令可找到檔案,卻不在/usr/lib裡,可用
sudo /sbin/ldconfig/
ldconfig的用途是:
在(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,找出可共享的動態程式庫(格式為:lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表. ldconfig通常在系統啟動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令.reference:
http://www.lslnet.com/linux/f/docs1/i19/big5190821.htm
http://blog.xuite.net/ian11832/blogg/33493241-Linux%E5%8B%95%E6%85%8B%26%E9%9D%9C%E6%85%8B%E5%87%BD%E5%BC%8F%E5%BA%AB%E8%A7%A3%E8%AA%AA