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