【问题标题】:static-libgcc and static-libstdc++ not workingstatic-libgcc 和 static-libstdc++ 不工作
【发布时间】:2015-10-04 16:22:07
【问题描述】:

我尝试使用 -static -static-libgcc -static-libstdc++ 编译项目,以便静态链接库。但是, exec 是使用动态链接库编译的。我尝试重新安装 gcc 和 g++,但没有帮助。这是我的本地环境错误,因为在其他机器上它是静态链接的。

ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.24, 
BuildID[sha1]=, not stripped

我有 Ubuntu 14.10,gcc 版本 4.8.4

谢谢

【问题讨论】:

  • 不太清楚你想让我们怎么做:(
  • 为什么有合适的flags静态链接时会动态链接。
  • 不知道。请给我们看一个测试用例.....
  • 好的,所以我的 exec 依赖于其他静态库。即使我在同一台计算机上编译它们然后链接它们,库也是动态链接的,但是如果我编译它们 exec 是静态编译的。

标签: c++ gcc static-libraries


【解决方案1】:

我也遇到了同样的问题。我能找到的最好的解释是这样的:

附带说明,您的链接器可能正在获取动态 (*.so) 阻止使用 -static-libstdc++ 和 -static-libgcc 的库。 每个调用 libgcc 和 libstdc++ 的库都应该静态链接 (当然,如果有可用的静态版本)。 https://stackoverflow.com/a/18263911/399105

进一步挖掘,似乎静态链接 glibc(gcc 默认使用)may not be a good idea either,还有更好的替代方案,例如 uClibcmusl libc

在两者之间,musl 似乎是最近才得到维护的,所以我就这么做了。我终于能够通过首先静态构建 musl 来构建一个完全静态的二进制文件:

./configure --disable-shared --enable-wrapper=gcc && make && sudo make install

然后使用musl静态构建其他软件:

CC="/usr/local/musl/bin/musl-gcc" LDFLAGS="-static" ./configure

如果你想了解更多细节,你可以在这里看到我在做什么:https://github.com/bmaupin/openldap-tools-static/blob/master/build.sh

【讨论】:

  • 那个 Stack Overflow 问题不是指 libgcc。它指的是 libc(同样适用于 libpthread)。另一方面,libgcc 为异常处理提供了一些的运行时支持,因此如果后者对前者的实现做出假设,那么将动态 libgcc 与静态 libstdc++ 混合可能是一个坏主意。但无论如何,您链接的 Stack Overflow 文章根本没有解决这个问题。
  • 伟大的收获!这样看起来更好吗?如果没有,我认为您应该能够提出修改建议以改进措辞。
猜你喜欢
  • 2012-10-21
  • 2020-06-17
  • 2015-06-04
  • 1970-01-01
  • 2014-12-05
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多