您可以使用-static-libstdc++
选项静态链接libstdc++
。如果你正在制作一个动态库,你可能不应该静态链接到libc
(或libgcc
,如果需要,你可以静态链接到-static-libgcc
);你需要选择加载共享库的应用程序的libc版本。
控制静态链接的其他选项可以在GCC manual中找到。您也可以通过将参数传递给链接器(-Wl,<argument>
,或直接调用ld
)来获得所需的结果。 LD manual列出了允许的选项。
实施例:
我写下面的代码
#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)
和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)
'-fPIC'可能区分大小写。我不知道这是否是问题。 – Simple
@Simple:我试着用'-fPIC',但是我仍然得到相同的错误。 – user10602
试试'-static-libstdC++'。有关链接选项,请参阅https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html。 – Andrew