2012年10月5日 星期五

Shared Library & Static Library

Shared Library - 動態連結程式庫:

在程式開始執行時才載入。

        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

沒有留言:

張貼留言