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

时间:2018-07-19 08:19:28

标签: g++ shared-libraries static-libraries mingw-w64

我正在尝试使用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。

专家的想法。...

1 个答案:

答案 0 :(得分:0)

  

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

完全正确:您必须在x86_64上编译以-fPIC的{​​{1}}链接到共享库的代码。

  

我无法理解为什么使用相同的静态库(不带-fpic的Windows编译)创建Windows dll的工作原理?

有两个原因:

  1. 在Windows上,默认位置无关的代码。因此,无论该标志是否在编译行上,您都可以像 -fPIC一样在命令行上编译代码。
  2. 拥有与位置无关的代码的要求是特定于体系结构的。您可以 构建一个不带 -fPIC的32位i*86共享库(这是不明智的做法,但是可以使用)。在-fPIC(64位)Linux上,您不能-它根本不能在该体系结构上工作。