boost靜態鏈接的問題 -lgcc_s


在使用gcc/g++ 編譯程序時我們希望指向一些庫是使用靜態的鏈接方式. 另外的一些是動態的方式.

我以boost 為例.

如果我們要使用靜態庫則是這樣的:

# g++ main.cpp -lpthread /usr/lib64/libboost_thread.a /usr/lib64/libboost_system.a

 

靜態庫直接寫路徑. 動態前面加-l  這樣也可以實現.

 

但有沒有更好的辦法呢. 有.

先參考個帖子:http://stackoverflow.com/questions/3698321/g-linker-force-static-linking-if-static-library-exists

根據老外這個帖子 照貓畫狗

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 選項就好了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM