我正在使用命令:
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 退出状态
但是,我尝试添加 -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/