您可以使用-static-libstdc++
链接选项libstdc++
静态地。您可能不应该静态链接到libc
(or libgcc
,您可以静态链接-static-libgcc
如果您需要)如果您正在制作动态库;您需要选择加载共享库的应用程序的 libc 版本。
其他控制静态链接的选项可以在海湾合作委员会手册 https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html。您还可以通过将参数传递给链接器来实现所需的结果(-Wl,<argument>
,或致电ld
直接地)。这LD手册 https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html列出允许的选项。
Example:
我写了下面的代码
#include <iostream>
extern "C" void do_something() {
std::cout << "Doing something!\n";
}
并将其编译为.o
文件如下:
g++ -fPIC -c -o tmp.o tmp.cpp
然后我从中生成了两个共享库。一种带有 -static-libstdc++,一种不带有:
g++ -shared -o tmp-shared.so tmp.o
g++ -shared -static-libstdc++ -o tmp-static.so tmp.o
为了比较,ldd tmp-shared.so
:
linux-vdso.so.1 => (0x00007fffc6dfd000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002b708cb43000)
libm.so.6 => /lib64/libm.so.6 (0x00002b708ce4c000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b708d0cf000)
libc.so.6 => /lib64/libc.so.6 (0x00002b708d2dd000)
/lib64/ld-linux-x86-64.so.2 (0x00000035c6c00000)
and ldd tmp-static.so
:
linux-vdso.so.1 => (0x00007fff99bfd000)
libm.so.6 => /lib64/libm.so.6 (0x00002acbec030000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002acbec2b3000)
libc.so.6 => /lib64/libc.so.6 (0x00002acbec4c1000)
/lib64/ld-linux-x86-64.so.2 (0x00000035c6c00000)