c++ - g++ 编译错误 : `.rodata' can not be used when making a shared object; recompile with -fPIC

标签 c++ c++11 g++

我正在使用命令:
g++ --std=c++11 -fPIC -Iincludes parser.cpp lib/main-parser.o lib/lib.a

在 Debian 9 上编译 C++ 程序。但我收到以下错误消息: /usr/bin/ld: lib/lib.a(csdocument.o): 创建共享对象时不能使用针对“.rodata”的重定位 R_X86_64_32;使用 -fPIC 重新编译 /usr/bin/ld:最终链接失败:输出中不可表示的部分 collect2:错误:ld 返回 1 退出状态

我已经看到了线程: Compilation fails with "relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object"

但是,我尝试添加 -fPIC 参数,但奇怪的是它给出了相同的错误消息,以及“使用 -fPIC 重新编译”

如有任何想法,我们将不胜感激。我已经尝试在我大学的 RedHat 系统上编译它并且在那里工作正常。我认为这可能是缺少依赖项,但我一直找不到任何答案。

提前致谢

最佳答案

因为看起来 gcc 正试图生成一个与位置无关的可执行文件(“共享对象”是提示),告诉它不要:

g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a

似乎 g++ 在您的系统上默认生成与位置无关的可执行文件。其他系统需要 -pie 才能这样做。使用 -no-pie 应该创建一个“常规”(位置相关)可执行文件。

(该错误是由于试图将编译为非位置无关的目标文件链接到应该是位置无关的可执行文件的结果)。

关于c++ - g++ 编译错误 : `.rodata' can not be used when making a shared object; recompile with -fPIC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459120/

相关文章:

c++ - 根据平台从多个结构定义中选择

c++ - 如何通过C++应用程序让Matlab监听实时数据

c++ - boost.Asio 在幕后执行什么处理程序?

python - 使用特征张量复制 TensorFlows Conv2D 操作

c++ - 以下是有效的 C++ 代码吗?

c++ - 如何手动输入数据矩阵?

c++ - 如何使用 "const unordered_map"?

C++:命名空间中变量的生命周期

c++ - 如何确定 C++11 成员函数的返回类型

windows - 使用 MinGW 编译凭证提供程序