我正在尝试在项目中静态链接标准库。我尝试了来自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++ -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);
}
我认为您正在使用不同的编译器或平台不支持的编译器,将自己的编译器版本记录下来,此标记有效,问题可能出在您的安装或编译器中的设置。
关于c++ - g++:静态链接不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15690214/