我正在尝试将静态库链接到共享库,但出现以下错误


/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

但这在 32 位机器上运行,没有任何此类错误。-fPIC手动标记到 Makefile 也没有解决问题

我尝试过-whole-archive按照建议标记这里但没有成功。

 
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): relocation R_X86_64_32S against `vtable for log4cplus::spi::AppenderAttachable' can not be used when making a shared object; recompile with -fPIC
../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): could not read symbols: Bad value
collect2: ld returned 1 exit status

创建liblog4cplus.a:

  1. unzip log4cplus-1.1.0.zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefile并将 -fPIC 添加到 CXXFLAGS 和 CFLAGS
  4. make

然后编译我的共享库:

  1. g++ -frtti -w -c -fPIC -I"Include_Directory" myfile.cpp
  2. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl

答案

假设您正在生成一个共享库,最有可能发生的情况是liblog4cplus.a你使用的不是编译的-fPIC检查他们的搬迁情况:

ar -x liblog4cplus.a  
readelf --relocs fileappender.o | egrep '(GOT|PLT|JU?MP_SLOT)'

如果输出为空,则静态库不是位置无关的,不能用于生成共享对象。

由于静态库包含已编译的目标代码,因此提供 -fPIC 标志不会有帮助。

您需要获取一个版本liblog4cplus.a编译为-fPIC并使用那个来代替。

来自: stackoverflow.com