2009-05-01 210 views
36

我需要分發一個可以在儘可能多的x86 Linux發行版上運行的二進制文件。這意味着我必須靜態鏈接一些庫,比如glibc,因爲用戶可能沒有我使用的版本。其他庫必須動態鏈接,如fontconfig,因爲它依賴於緩存文件格式和每個系統上可能不同的硬編碼位置。在gcc中同時使用靜態鏈接庫和動態鏈接庫

什麼是命令行選項來做到這一點?如果我指定-static,那麼gcc將拒絕動態鏈接任何庫。

回答

68

靜態鏈接任何系統庫,以及特別是針對libc,現代UNIX或Linux系統,使二元顯著便攜。只是不要這樣做。

相反,使用向後兼容性(在較舊的系統上鍊接的二進制文件繼續在所有較新的系統上運行),可以通過鏈接舊系統上的二進制文件(我使用RedHat 6.2,並且我還沒有看到Linux系統在哪裏我的二進制不會運行在過去8年),或通過使用像autopackage

要回答你原來的問題:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic 

會導致連接使用libfoo的歸檔版本。 [重要的是要有正確的尾部-Wl,-Bdynamic,以便您不強制使用靜態libc。]

+6

第一次我看到了對該尾隨動態的解釋,乾杯 – 2010-02-09 14:47:44

2

嘗試傳遞鏈接器命令行中鏈接的庫文件的路徑(不管是.a還是.so庫),並且是靜態的。這應該夠了吧。

+0

當沒有`-static`時,還有ld的`-l:`選項,它可以用全名鏈接某個庫,而不用ld將它擴展爲`lib + name + .so`:`` -l:libsome_library.a`(https://sourceware.org/binutils/docs-2.18/ld/Options.html - `-lnamespec`「)如果namespec的格式爲:filename,則ld將搜索庫路徑文件稱爲文件名,否則它會搜索名爲libnamespec.a的文件的庫路徑。「) – osgx 2017-05-24 17:07:50

3

需要注意的是,在Linux下,只有靜態鏈接庫時,如果沒有任何動態庫取決於在上面。這意味着如果您使用任何動態庫,則可以忘記靜態鏈接libc。只是使用一個相當舊的版本來構建針對libc的情況;多年來,libc一直保持強勁的ABI向後兼容性。