Linux編譯鏈接之庫

簡要記錄linux下編譯靜態庫和動態庫的方法,

1.靜態庫(*.a)

編譯:cc -Wall -c ctest1.c ctest2.c

創建靜態庫:ar -cvq libctest.a ctest.o ctest2.o

顯示靜態庫中的文件列表(創建符號表):ar -t libctest.a

鏈接使用:

cc -o executable_name prog.c libctest.a
cc -o executable_name prog.c -L/path/tolibrary_directory -lctest

列出靜態庫中包含的目標文件


列出靜態庫中目標文件所包含的詳細API,這個很有用哦

nm /usr/lib/libopencv_ts.a


2.動態庫(*.so)

下述命令模塊,建立共享動態庫libctest.so.1.0,同時進行符號鏈接;

gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o
mv libctest.so.1.0 /opt/lib
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so


Wall: 顯示警告信息;

-fPIC: 即position independent code,編譯時相對位置查找

-shared: 生成動態庫的選項

-Wl,option: 傳遞參數,此處"-soname libctest.so.1",即命名;

-o: 目標名稱

如果爲了省事兒,可以採用下述命令生成.so

gcc *.c -fPIC -shared -o libctest.so.1

在調用動態庫時,可以採取下述模式

gcc -Wall -I/path/to/include_files -L/path/to/libraries prog.c -lctest -o prog
//like this
gcc -Wall -L/ot/lib prog.c -lctest -o prog

查詢執行文件的依賴庫: ldd prog

2.1 配置動態庫路徑 Libary Path

爲了可執行文件在運行時能夠找到動態庫,需要配置路徑(下述方法至少採取一個)

2.1.1.修改/etc/ld.so.conf執行ldconfig

在/etc/ld.so.conf文件下加入動態庫所在的目錄,然後以root執行ldconfig

ps:

ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認爲 /etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.

2. 向library cache內增加特殊路徑的緩存(as root)

ldconfig -n /lib_path

此處lib_path爲需求庫所在的目錄;當然也可以使用相對路徑,以方便移動;此種方式有一個缺點,在關機之後library cache將會丟掉所加的內容。

3.修改環境變量LD_LIBRARY_PATH

不同版本的linux/unix中表示庫文件路徑的變量名稱不統一,此處以linux/solaris爲例,另外mac os x: DYLD_LIBRARY_PATH

 export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PAT
或者在~/.bashrc末尾加入:

...
if [ -d /opt/lib ];
then
   LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
fi
...
export LD_LIBRARY_PATH

總的說來,編譯器會先在path文件夾下搜索libxxx.so文件,如果沒有找到,繼續搜索libxxx.a(靜態庫)。

3.參考

【1】 ldconfig和ldd的用法
【2】 靜態庫/動態庫







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章