g ++:静态链接不起作用

时间:2013-03-28 19:11:09

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

我正在尝试静态链接项目中的标准库。我已经在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,但无济于事。

2 个答案:

答案 0 :(得分:0)

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);
}

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

答案 1 :(得分:0)

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

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