Glibc的静态链接

时间:2013-01-28 17:28:08

标签: c++ g++ glibc static-linking

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

现在我的编译命令:

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

谢谢!

2 个答案:

答案 0 :(得分:8)

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

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

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

如果你的答案是,也许继续下去是有意义的。如果答案是否定的,或者问题似乎过于模糊且没有答案,那么只需使用静态链接的glibc退出你的过期:它有更多的机会受伤而不是帮助。

答案 1 :(得分:1)

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

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