我正在尝试使用g ++生成共享库(libgenic.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
标志进行编译。我无法理解为什么使用相同的静态库(不带-fpic的Windows编译)创建Windows dll的原因?我将x86_64-w64-mingw32-g ++用于Windows DLL。
专家的想法。...
答案 0 :(得分:0)
其中指出,静态库中的目标文件需要使用-fpic标志进行编译。
完全正确:您必须在x86_64
上编译以-fPIC
的{{1}}链接到共享库的代码。
我无法理解为什么使用相同的静态库(不带-fpic的Windows编译)创建Windows dll的工作原理?
有两个原因:
-fPIC
一样在命令行上编译代码。-fPIC
的32位i*86
共享库(这是不明智的做法,但是可以使用)。在-fPIC
(64位)Linux上,您不能-它根本不能在该体系结构上工作。