【问题标题】:g++: Static linking not workingg++:静态链接不起作用
【发布时间】:2013-03-28 19:11:08
【问题描述】:

我正在尝试静态链接我的项目中的标准库。我已经从 SO 和其他网站 (http://www.trilithium.com/johan/2005/06/static-libstdc/) 上的各种线程中尝试了几种静态链接选项的变体,但都没有产生预期的结果。

这是我当前的标志设置:

g++ -Wall -g -static-libgcc -static-libstdc++ -Iinclude -std=c++11

我也试过了:

g++ -Wall -g -Wl,-Bstatic -lstdc++ -std=c++11

对于这些变体中的任何一个,ldd 的输出仍然是:

linux-gate.so.1 => (0xb77b1000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x4e085000)
libm.so.6 => /lib/libm.so.6 (0x4daf0000)
libgcc_s.so.1 -> /lib/libgcc_s.s0.1 (0x4dd1f000)
libc.so.6 => /lib/libc.so.6 (0x4d90a000)
/lib/ld-linux.so.2 (0x4d8e7000)

运行file 还告诉我它是一个动态链接的二进制文件。我已经在多个发行版上尝试过,包括 Fedora 18、Ubuntu 12.04 和 CentOS,但无济于事。

【问题讨论】:

  • 你是怎么编译的?通过制作?用 g++ 手动?

标签: c++ linux gcc linker g++


【解决方案1】:
g++ -Wall -g -static-libgcc -static-libstdc++ -std=c++0x hello.cpp

来自 ldd 的输出

linux-vdso.so.1 =>  (0x00007fffef928000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe12439000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe12822000)

在我的 Ubuntu 12.04 下工作,我也怀疑你使用的是 Ubuntu 12.04 下支持的 gcc/g++ 版本,因为它是 g++ 4.6 而 g++ 4.6 不提供 -std=c++11 标志。

g++ -std=c++0x -static hello.cpp

这也可以按预期将所有内容编译成一个静态对象。

我的hello.cpp的来源

#include <iostream>

int main(int argc, char* argv[])
{
  [](void){std::cout << "hello" << std::endl;}();
  return(0);
}

我认为您正在使用不同的编译器或您的平台不支持的编译器,请记录您自己的编译器版本,此标志有效,问题可能是您的安装或编译器中的设置。

【讨论】:

  • 嗯,好奇。我正在使用 gcc 4.7.2,但我找不到任何关于可能涉及静态链接的错误的资源。
  • @JohnRuffer 它也可能只是您的设置或库的问题,不一定是错误。尝试进行更详细的编译,将-v 标志或仅用于链接器的-Wl,-v 添加到您的g++,并从一组最小且简单的标志开始。
  • 感谢您的建议。我浏览了我的makefile;这确实是一个配置错误。我无意中忽略了我的目标中的标志。傻我。再次感谢您的帮助!
【解决方案2】:

我尝试将 -static-libgcc -static-libstdc++ 与其他静态库链接:protobuf、pthread、rt 并且每次遇到不同的问题。

我找到的解决方案是使用外部工具Ermine 并解决了我所有的问题。基于:Statifier

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多