【问题标题】:Relocation errors when linking a static library with shared library将静态库与共享库链接时出现重定位错误
【发布时间】:2018-12-27 07:11:18
【问题描述】:

我正在尝试使用 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标志进行编译。我无法理解为什么使用相同的静态库(为没有 -fpic 的 Windows 编译)创建 Windows dll 有效?我将 x86_64-w64-mingw32-g++ 用于 Windows DLL。

专家的想法......

【问题讨论】:

  • 因为 PIC 是 Windows 上的默认设置,所以不需要这个标志。
  • 这是否意味着使用mingw编译的目标文件默认是位置无关的?
  • 是的,这是我的理解。

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


【解决方案1】:

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

完全正确:在x86_64 上,您必须编译与-fPIC 或-fPIC 链接到共享库的代码。

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

有两个原因:

  1. 在 Windows 上,与位置无关的代码是默认设置。所以你得到编译的代码好像 -fPIC 在命令行上,不管那个标志是否在编译行上。
  2. 具有与位置无关的代码的要求是特定于体系结构的。你可以构建一个 32 位的 i*86 共享库没有 -fPIC(这是不明智的,但它有效)。在x86_64(64 位)Linux 上,你不能——它根本不能在那个架构上工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多