我正在使用命令:
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
但是,我已经尝试添加-fPIC
参数,但它奇怪地给出了相同的错误消息,以及“使用-fPIC重新编译”
任何想法,将不胜感激。我已经尝试在我的大学的RedHat系统上编译它,它在那里工作正常。我认为这可能是一个缺失的依赖,但我一直无法找到任何答案。
提前致谢
由于gcc似乎正在尝试生成与位置无关的可执行文件,请告诉它不要:
g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a
似乎g++
默认在您的系统上生成与位置无关的可执行文件。其他系统需要-pie
才能这样做。使用-no-pie
应该创建一个“常规”(位置相关)可执行文件。
/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
此链接器错误告诉您静态库csdocument.o
中的目标文件lib/lib.a
不是位置独立代码,因此无法与您的PIE程序链接。因此,您需要使用lib/lib.a
重新编译-fPIC
的源文件,然后重建静态库,然后将其与您的PIE程序链接。如果您无法控制libary源,请从其供应商处请求PIC构建。
(其他人质疑为什么你需要建立一个PIE目标,因为它不是一个共享库。在Debian 9中,GCC生成PIE executables by default,无论是程序还是共享库。对于Ubuntu,从17.04开始也是如此。)
添加这个对我有用。
g++ --std=c++11 -no-pie
我还添加了-fPIC
来编译标志。