我正在使用命令:
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): relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
我已经看到了线程: 编译失败,“在制作共享对象时无法使用针对 `.rodata.str1.8’ 的重定位 R_X86_64_32”
但是,我尝试添加 -fPIC
参数,但奇怪的是它给出了相同的错误消息,以及“使用 -fPIC 重新编译”
任何想法,将不胜感激。我试过在我大学的 RedHat 系统上编译它,它在那里工作得很好。我认为这可能是缺少依赖项,但我一直找不到任何答案。
提前致谢
原文由 Polymer 发布,翻译遵循 CC BY-SA 4.0 许可协议
看起来 gcc 正在尝试生成与位置无关的可执行文件(“共享对象”是提示),告诉它不要:
似乎
g++
默认情况下会在您的系统上生成与位置无关的可执行文件。其他系统需要-pie
才能这样做。使用-no-pie
应该创建一个“常规”(取决于位置)可执行文件。(该错误是由于尝试将编译为非位置无关的目标文件链接到应该与位置无关的可执行文件的结果)。