【发布时间】:2013-01-12 03:00:22
【问题描述】:
如何编译静态链接 glibc 库的应用程序,但只编译我的应用程序所需的代码? (不是所有的库)
现在我的编译命令:
g++ -o newserver test.cpp ... -lboost_system -lboost_thread -std=c++0x
谢谢!
【问题讨论】:
标签: c++ g++ glibc static-linking
如何编译静态链接 glibc 库的应用程序,但只编译我的应用程序所需的代码? (不是所有的库)
现在我的编译命令:
g++ -o newserver test.cpp ... -lboost_system -lboost_thread -std=c++0x
谢谢!
【问题讨论】:
标签: c++ g++ glibc static-linking
这就是-static 所做的(如另一个答案中所述):不需要的模块不会链接到您的程序中。但是您对需要的东西数量的期望(从某种意义上说,我们无法说服链接器相反)可能过于乐观。
如果您尝试实现可移植性(在其他具有较旧 glibc 或类似工具的机器上运行可执行文件),则有一个简单的测试问题可以查看您是否会得到您想要的:
你有没有想过libnss的问题,你确定它不会咬你吗?
如果您的回答是是,那么继续下去也许是有意义的。如果答案是否定的,或者问题看起来太模糊而没有答案,只需使用静态链接的 glibc 退出过期:它有更多的伤害而不是帮助。
【讨论】:
将-static 添加到编译行。它只会添加你的应用程序需要的东西[当然,你应用程序调用的任何函数,以及这些函数调用的任何函数,包括一堆启动代码和其他一些零碎的东西],所以它大约是 800K(对于一个简单的“hello world”程序)在 x86 机器上。其他架构各不相同。由于 boost 可能至少也会调用标准库一点点,因此您的应用程序中可能会添加超过 800K。但它只应用最终二进制文件中任何代码使用的函数,而不是整个库[大约 2MB 作为共享库]。
如果您只想要链接 glibc,则需要将链接行修改为您的编译为:
-Wl,-Bstatic -libc -Wl,-Bdynamic。这将防止任何其他库被静态链接[你有时需要有多个这些语句,因为有时另一个库拉入的东西需要从 glibc 拉入“更多”——别担心,它不会的不要引入超出链接器认为必要的任何内容]。
【讨论】: