我有一個鏈接到很多圖書館的程序。默認情況下,g++
更喜歡鏈接到共享庫,即使存在相應的存檔。g ++鏈接器:如果靜態庫存在,強制靜態鏈接?
如果存在靜態存檔,如何將此首選項更改爲首選動態庫上的靜態存檔?
請注意,我使用-static
選項,但它試圖找到所有庫的靜態存檔,這不是我想要的。
我有一個鏈接到很多圖書館的程序。默認情況下,g++
更喜歡鏈接到共享庫,即使存在相應的存檔。g ++鏈接器:如果靜態庫存在,強制靜態鏈接?
如果存在靜態存檔,如何將此首選項更改爲首選動態庫上的靜態存檔?
請注意,我使用-static
選項,但它試圖找到所有庫的靜態存檔,這不是我想要的。
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
將鏈接zlib
和libfoo
靜態和libbar
動態。 --as-needed
將刪除任何未使用的動態庫。
當您只想靜態鏈接一個或兩個庫與其餘庫(包括系統庫)時,它們是動態的,通過全名簡單引用靜態庫往往更容易。即而不是使用-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:
)來直接指定庫。
另請參閱: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