【问题标题】:Static linking of GlibcGlibc的静态链接
【发布时间】:2013-01-12 03:00:22
【问题描述】:

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

现在我的编译命令:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这也将静态链接到 boost 库和其他我认为不需要的库(但我不确定我是否理解这个问题)
      • 啊,好点子,你得花点心思才能只静态链接一个库。
      • @JonathanWakely,我需要这个,因为在客户端机器上可能是 2.5、2.2 版本的 glibc,但我有 2.7 版本,我需要在所有版本的 glibc(或一两个最新版本),我该如何编译来实现这一点?谢谢!
      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 2012-05-09
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      相关资源
      最近更新 更多