将静态库与共享库链接时发生重新定位错误



我正在尝试使用g++生成一个共享库(libgenerated.so(。共享库使用了来自第三方静态库(libmystatic.a(的一些功能。为此,我将静态库与共享库链接为:

g++ -shared -o libgenerated.so $(OBJ_FILES) -lmystatic

上述命令返回静态库的以下重新定位错误:

relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC

指出静态库中的对象文件需要使用-fpic标志进行编译。我无法理解为什么使用相同的静态库创建Windows dll(为没有-fpic的Windows编译(有效?我使用x86_64-w64-mingw32-g++作为Windows DLL。

专家的想法。。。。

指出静态库中的对象文件需要使用-fpic标志进行编译。

没错:在x86_64上,必须编译与-fPIC-fPIC链接到共享库中的代码。

我无法理解为什么使用相同的静态库创建Windows dll(为没有-fpic的Windows编译(有效?

有两个原因:

  1. 在Windows上,位置无关代码是默认代码。因此,无论该标志是否在编译行上,都可以将代码编译为,就好像-fPIC在命令行上一样
  2. 具有独立于位置的代码的要求是特定于体系结构的。可以在没有-fPIC的情况下构建32位i*86共享库(这是不明智的,但有效(。在x86_64(64位(Linux上,你不能——它根本不能在那个体系结构上工作

最新更新