我如何静态 link zstd 库到我的动态库?

How do I statically link zstd library to my dynamic library?

我正在尝试静态 link zstd 库(我有 libzstd.a 或 libzstd.so)到我的共享库 libtest.so。这个想法是,当在我们的应用程序中部署 libtest.so 时,我们不必再依赖 libzstd.a 或 libzstd.so,所以我们必须静态 link zstd 库.

我试过这些:

cc  -fPIC -Wl,-soname=libtest.so -static-libgcc  -shared -o libtest.so myobjects.o -ldl -lc -L/path/to/libzstd -l:libzstd.a
cc  -fPIC -Wl,-soname=libtest.so -static-libgcc  -shared -o libtest.so myobjects.o -ldl -lc -Wl,-Bstatic -L/path/to/libzstd -l:libzstd.a
cc  -fPIC -Wl,-soname=libtest.so -static-libgcc  -shared -o libtest.so myobjects.o -ldl -lc /path/to/libzstd/libzstd.a

但他们都给我这个错误:

/bin/ld: /path/to/libzstd/libzstd.a(zstd_common.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; 
recompile with -fPIC
/path/to/libzstd/libzstd.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [libtest.so] Error 1

这里有什么问题?谢谢!

必须编译链接到共享库的所有目标文件 作为与位置无关的代码(编译器选项 -fPIC)。

链接器错误:

/bin/ld: /path/to/libzstd/libzstd.a(zstd_common.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; 
recompile with -fPIC

告诉你共享库 libtest.so 的链接需要目标文件 zstd_common.o 来自 存档 libzstd.a,但目标文件不是用 -fPIC.

编译的

所以你必须从源代码重建libzstd.a,这次是编译对象 它包含 -fPIC.

的文件