您可以使用-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