Вы можете использовать опцию -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
@ Простой: я пытался с '-fPIC', но я все равно получаю ту же ошибку. – user10602
Попробуйте '-static-libstdC++'. См. Https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html для соответствующих ссылок. – Andrew