14

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

现在我的编译命令:

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

谢谢!

4

2 回答 2

8

这就是-static(如另一个答案中所述):不需要的模块不会链接到您的程序中。但是您对所需内容数量的期望从某种意义上说,我们无法说服链接器相反)可能过于乐观。

如果您尝试为可移植性而做(在其他机器上使用较旧的 glibc 或类似的东西运行可执行文件),有一个简单的测试问题可以查看您是否会得到您想要的:

你有没有想过 的问题libnss,你确定它不会咬你吗?

如果你的答案是肯定的,也许继续下去是有意义的。如果答案是否定的,或者问题看起来太模糊并且没有答案,只需使用静态链接的 glibc 退出你的过期:它有更多的伤害而不是帮助。

于 2013-01-28T17:41:31.727 回答
4

添加-static到编译行。它只会添加你的应用程序需要的东西[当然,你应用程序调用的任何函数,以及这些函数调用的任何函数,包括一堆启动代码和其他一些零碎的东西],所以它大约是 800K(对于一个简单的“hello world”程序)在 x86 机器上。其他架构各不相同。由于 boost 可能至少也会调用标准库一点点,因此您的应用程序中可能会添加超过 800K。但它只应用最终二进制文件中任何代码使用的函数,而不是整个库[大约 2MB 作为共享库]。

如果您只想要链接 glibc,则需要将链接行修改为您的编译为: -Wl,-Bstatic -libc -Wl,-Bdynamic. 这将防止任何其他库被静态链接[你有时需要有多个这些语句,因为有时另一个库拉入的东西需要从 glibc 拉入“更多”——别担心,它不会的t 引入超出链接器认为必要的任何内容]。

于 2013-01-28T17:32:44.680 回答