Glibc的静态链接

14

我该如何编译我的应用程序,将glibc库静态链接,但只链接我应用程序所需的代码?(不是所有的库)

现在我的编译命令:

g++  -o newserver  test.cpp ... -lboost_system -lboost_thread -std=c++0x

谢谢!

2个回答

7
这就是-static的作用(正如另一个答案中所述):不需要的模块不会链接到你的程序中。但是你对于必要内容的期望值(从我们无法说服连接器的角度来看)可能过于乐观。
如果你尝试为了可移植性(在具有较旧glibc或类似问题的其他计算机上运行可执行文件)进行此操作,这里有一个简单的测试问题,可以判断是否能够实现你想要的结果:
你是否考虑到了libnss的问题,并且你确定它不会影响你?
如果你的回答是,那么也许继续进行有意义。如果答案是否定的,或者问题似乎太难理解且没有答案,那就放弃使用静态链接的glibc进行实验吧:它可能比有益更容易造成伤害。

4
在编译行中添加-static。它只会添加你的应用程序所需的内容[当然,包括应用程序调用的函数、那些函数调用的函数以及一些启动代码和其他一些部分],因此在x86机器上,一个简单的“hello world”程序大约为800K。其他架构有所不同。由于boost可能至少会调用标准库,所以您的应用程序可能会增加超过800K的大小。但它仅适用于最终二进制文件中使用的任何代码所使用的函数,而不是整个库[作为共享库约为2MB]。
如果您只想链接glibc,您需要修改链接行到编译: -Wl,-Bstatic -libc -Wl,-Bdynamic。这将防止任何其他库被静态链接[有时需要有多个这样的语句,因为有时由另一个库引入的某些东西需要从glibc中引入“更多”——不要担心,它不会带来比链接器认为必要的东西更多的东西]。

1
这也将静态链接到boost库和其他库,我认为这不是所期望的(但我不确定我是否理解了问题)。 - Jonathan Wakely
啊,说得好,你必须要把一些技巧运用到极致,才能只静态链接一个库。 - Mats Petersson
@JonathanWakely,我需要这个是因为客户机器上可能有2.5、2.2版本的glibc,但我有2.7版本,我需要让我的应用程序在所有版本的glibc(或最近的一两个版本)上工作,我该如何编译才能实现这一点?谢谢! - Breakdown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接