在使用gcc/g++ 編譯程式時我們希望指向一些庫是使用靜態的鏈結方式. 另外的一些是動態的方式.
我以boost 為例.
如果我們要使用靜態庫則是這樣的:
# g++ main.cpp -lpthread /usr/lib64/libboost_thread.a /usr/lib64/libboost_system.a
靜態庫直接寫路徑. 動態前面加-l 這樣也可以實現.
但有沒有更好的辦法呢. 有.
先參考個帖子:
根據老外這個帖子 照貓畫狗
g++ main.cpp -lrt -wl,-bstatic -lboost_system -lboost_thread -wl,-bdynamic
這樣就可以了.
再來看一下老外的這個例子:
g++ main.cpp -wl,-bstatic -lz -lfoo -wl,-bdynamic -lbar -wl,--as-needed
will link zlib and libfoo as static, and libbar as dynamic . --as-needed will drop any unused dynamic library.
但是這個過程中我用了將近1天時間才搞定的.
因為我剛開始是這樣寫的:
g++ main.cpp -lrt -wl,-bstatic -lboost_system -lboost_thread
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
於是我就按照這個提示搞. 意思就是 libgcc_s.so 沒找到. 於是 我就折騰這個. 明明它在.可是就是提示找不到這個錯誤.
搞了大半天就要放棄了..
我最後想是不是 要在後面加 -wl,-bdynamic 其它的庫才能預設動態鏈結.
試了一下果然..
我在後面加了這個就成功了.
g++ main.cpp -lrt -wl,-bstatic -lboost_system -lboost_thread -wl,-bdynamic -wl,--as-needed
-wl,--as-needed 這個選項是可選的是 這個選項的意思是去除沒有使用的動態庫
還有乙個比較簡單的錯誤就是 :
thread.cpp:(.text+0x1a93): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1b08): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1b6f): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1bd6): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1c3d): undefined reference to `clock_gettime'
一般動態鏈結時不會出現這個錯. 是靜態鏈結時才出這個錯.
加上 -lrt 選項就好了.
boost庫的鏈結問題小記
一直有疑問,boost部分庫需要編譯成lib或者dll才能使用,貌似預設的都是鏈結的靜態庫,但是比如regex,使用時從來不需要 pragma comment lib,或者在link選項裡新增進去,表示不解。後來網上一搜,boost 裡有個auto link.hpp,貌似來幫你完成鏈結工作.下面 使...
MAC 平台使用qt 靜態鏈結boost 庫問題
boost 庫是自己編譯的,64位的靜態庫。但是在使用qt 的時候,靜態鏈結總是失敗。把qt 工程轉成xcode 功能之後鏈結也失敗,但是失敗的資訊更詳細一些。猜測應該是標準模板庫鏈結出問題了,這個還真是從來沒見過,然後再xcode 裡面折騰了好久,終於發現乙個地方可以配置 把這個修改一下,選擇第二...
鏈結靜態庫的順序問題
libb.a依賴於是liba.a,而可執行檔案test只直接依賴於libb.a,則鏈結選項應當為 b a,而不是 a b,否則會報liba.a中的某些符號找不到.gcc c a.c ar cr liba.a a.o gcc c b.c ar cr libb.a b.o 雖然libb.a使用到了lib...