独立的共享库

use*_*602 6 c++ shared-libraries static-linking

我需要创建一个共享库,必须将其自己的依赖项(包括libc / libstdc ++)静态链接到该共享库,以生成一个自包含的二进制文件。我试图做到这一点

g++ -c -fpic -o foo.o foo.cpp
g++ -static -shared -o foo.so foo.o
Run Code Online (Sandbox Code Playgroud)

失败与:

/usr/bin/ld.bfd.real: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/crtbeginT.o: relocation R_X86_64_32 against `__TMC_END__' can not be      used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/crtbeginT.o: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我做错了吗?

And*_*rew 3

您可以使用静态-static-libstdc++链接选项libstdc++。如果您正在创建动态库,您可能不应该静态链接到libc(或者libgcc,如果需要,您可以静态链接到);-static-libgcc您需要选择加载共享库的应用程序的 libc 版本。

其他控制静态链接的选项可以在GCC 手册中找到。您还可以通过将参数传递给链接器(-Wl,<argument>ld直接调用)来实现所需的结果。LD手册列出了允许的选项。


例子:

我写了下面的代码

#include <iostream>

extern "C" void do_something() {
    std::cout << "Doing something!\n";
}
Run Code Online (Sandbox Code Playgroud)

并将其编译成.o文件如下:

g++ -fPIC -c -o tmp.o tmp.cpp
Run Code Online (Sandbox Code Playgroud)

然后我从中生成了两个共享库。一种带有 -static-libstdc++,一种不带有:

g++ -shared -o tmp-shared.so tmp.o
g++ -shared -static-libstdc++ -o tmp-static.so tmp.o
Run Code Online (Sandbox Code Playgroud)

为了比较,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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • 您还需要“-static-libgcc”来删除“libgcc_s.so.1”依赖项。 (2认同)