【问题标题】:How do I statically link zstd library to my dynamic library?如何将 zstd 库静态链接到我的动态库?
【发布时间】:2018-04-27 04:39:23
【问题描述】:

我正在尝试将 zstd 库(我有 libzstd.a 或 libzstd.so)静态链接到我的共享库 libtest.so。想法是,在我们的应用程序中部署 libtest.so 时,我们不必再依赖 libzstd.a 或 libzstd.so,因此我们必须静态链接 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

这里有什么问题?谢谢!

【问题讨论】:

    标签: gcc linker shared-libraries static-libraries static-linking


    【解决方案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 的文件。

    【讨论】:

    • 是的,我昨晚也发现了。在所有源文件上使用 -fPIC 重新编译 libzstd.a,现在它可以正常链接。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多