2009-05-01 189 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向后兼容性。