You can use the -static-libstdc++
option to link libstdc++
statically. You probably shouldn't link statically to libc
(or libgcc
, which you can link statically with -static-libgcc
should you need to) if you're making a dynamic library; you'll want to pick up the libc version of the application that loads your shared library.
Other options controlling static linking can be found in the GCC manual. You may also be able to achieve the desired results by passing arguments to the linker (-Wl,<argument>
, or calling ld
directly). The LD manual lists the permitted options.
Example:
I wrote the following code
#include <iostream>
extern "C" void do_something() {
std::cout << "Doing something!\n";
}
and compiled it to a .o
file as follows:
g++ -fPIC -c -o tmp.o tmp.cpp
I then produced two shared libraries from it. One with -static-libstdc++, and one without:
g++ -shared -o tmp-shared.so tmp.o
g++ -shared -static-libstdc++ -o tmp-static.so tmp.o
For comparison, 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)