代码之家  ›  专栏  ›  技术社区  ›  user2577547

如何将zstd库静态链接到动态库?

  •  1
  • user2577547  · 技术社区  · 6 年前

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

    这里有什么问题?非常感谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mike Kinghan    6 年前

    必须编译链接到共享库中的所有对象文件 作为位置独立代码(编译器选项 -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公司