在gcc中使用静态和dynamic链接库

我需要分发一个可以在尽可能多的x86 Linux发行版上运行的二进制文件。 这意味着我必须静态链接一些库,比如glibc,因为用户可能没有我使用的版本。 其他库必须dynamic链接,如fontconfig,因为它依赖于caching文件格式和每个系统上可能不同的硬编码位置。

什么是命令行选项来做到这一点? 如果我指定-static,那么gcc将拒绝dynamic链接任何库。

在现代UNIX或Linux系统上静态链接任何系统库,尤其是针对libc ,使得二进制文件的可移植性显着降低 。 只是不要这样做。

相反,使用向后兼容性(在旧系统上链接的二进制文件继续在所有新的系统上运行),或者通过链接旧系统上的二进制文件(我使用RedHat 6.2,而且我还没有看到Linux系统在哪里我的二进制文件不会在过去的8年中运行),或者使用类似autopackage的东西。

回答你原来的问题:

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

会导致链接器使用libfoo的存档版本。 [重要的是具有后面的-Wl,-Bdynamic所以你不强制使用静态libc。]

尝试传递链接器命令行链接的库文件的path(不pipe是.a还是.so库),并且是静态的。 这应该够了吧。

应该指出的是,在Linux下,只有(安全)静态链接一个库,如果没有dynamic库依赖它。 这意味着如果你使用任何dynamic库,你可以忘记静态链接libc。 只是用一个相当老的版本来打造针对libc的情况; 多年来,libc一直保持强劲的ABI向后兼容性。