2010-09-13 120 views
46

我有一個鏈接到很多圖書館的程序。默認情況下,g++更喜歡鏈接到共享庫,即使存在相應的存檔。g ++鏈接器:如果靜態庫存在,強制靜態鏈接?

如果存在靜態存檔,如何將此首選項更改爲首選動態庫上的靜態存檔?

請注意,我使用-static選項,但它試圖找到所有庫的靜態存檔,這不是我想要的。

+0

另請參閱:http://stackoverflow.com/questions/4500158/how-can-i-force-linking-with-a-static-library-when-a-shared-library-of-same-name – Antonio 2016-04-13 15:39:19

回答

62
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed 

將鏈接zliblibfoo靜態和libbar動態。 --as-needed將刪除任何未使用的動態庫。

5

當您只想靜態鏈接一個或兩個庫與其餘庫(包括系統庫)時,它們是動態的,通過全名簡單引用靜態庫往往更容易。即而不是使用-l-L來讓g ++從它找到的庫中解析出一個庫,簡單地將庫的完整路徑作爲輸入。鑑於以上++命令克,到main.o應用主程序鏈接到靜態libz進行和libfoo的和動態和libbar的等libglib:

``` 克++ main.o /usr/lib/libz.a/usr/lib中/libfoo.a -lbar

編輯17年8月3日: 我剛剛絆倒橫跨this answer其進入更多細節,並提供一種替代方法(-l:)來直接指定庫。