【问题标题】:CDT using lib*.a --- relocation R_X86_64_32S against symbol ... can not be usedCDT 使用 lib*.a --- 重定位 R_X86_64_32S 对符号 ... 不能使用
【发布时间】:2018-01-23 07:27:56
【问题描述】:

我尝试在 CDT 中为我的 c++ 项目引用静态 *.a 库。我把它包含在

C/C++ 构建 -> 跨 C++ 链接器 -> 库

但我得到了错误:

重定位 R_X86_64_32S 对符号 ... 在制作共享对象时不能使用。

现在从我到目前为止所读到的内容来看,我认为这意味着编译器认为我正在引用一个共享库,而它是一个静态库 - 是这样吗?如果是这样,现在可以做什么?有什么方法可以只使用*.a 库还是我必须将它们重新编译为.so - 对象?

【问题讨论】:

  • 只是想知道,这个 Cross C++ 链接器是什么?是为了交叉编译吗?
  • @kiner_shah 我不太确定它到底是什么。我指的是 CDT IDE 中的分类帐,它是 Eclipse 的 C++ 风格

标签: c++ shared-libraries static-libraries eclipse-cdt


【解决方案1】:

问题很可能是由于静态库是在不支持position independent code 的情况下编译的。我不知道如何在不重新编译静态库的情况下修复它。

如果您可以重新编译静态库,那么假设您使用的是 gcc 或 clang,则必须将 -fPIC 标志添加到您的编译器标志中。

没有更多信息,很难给出更多建议。如果您可以提供minimal, reproducible example,那么我可以为您提供帮助。

【讨论】:

  • 您能否添加一些对标志的引用以启用 PIC,例如在 CMAKE 和/或其他常见类型的 makefile 中?谢谢
  • 对于 CMake it is easy。对于其他构建系统,我不能 100% 确定,但基本上你必须使用 -fPIC 选项扩展 CFLAGS 和/或 CXXFLAGS。对于 unix makefile,它看起来类似于 this
【解决方案2】:

在我的例子中,我刚刚将它编译为 *.a,所以我很确定再次重新编译 *.a 是行不通的,同时 gcc 没有机会更新。因此,我已经尝试了您在问题中提到的内容:删除了 .a 库并重新编译并安装为 .so 并且它起作用了。谢谢:D

【讨论】:

    【解决方案3】:

    我不得不重新编译,但再次编译为 *.a 库就足够了。我很确定问题源于我的 gcc 编译器的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 2016-06-06
      • 2018-08-12
      • 2018-06-19
      • 2017-07-23
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      相关资源
      最近更新 更多