我正在尝试编译的项目并不复杂,除了标准库和一个自包含的库(所有东西都可以在另一个系统上编译)之外,它什么都没有引用。如标题所示,它甚至不能链接到标准库中的内容,因为据推测其中没有使用-fPIC
进行编译。我不是自己构建的,也不是我不想构建的,用apt
重新安装东西似乎并不能解决“用-fPIC重新编译”的问题。
我会说,我认为此问题的一个可能原因是由于gcc-multilib
或较早安装的东西,但我认为已清除该问题。我不知道,也许有些东西被覆盖了,或者发生了冲突。甚至可能没有关系。有什么想法吗?
运行Ubuntu 18.04
g++ -I inc -I /usr/include/mono-2.0 -MMD -MF dep/Nonsense.d -std=c++17 -O3 -fno-stack-protector -fno-unroll-loops -fomit-frame-pointer -Wno-ignored-optimization-argument -c -o obj/Nonsense.o src/Nonsense.cpp
g++ -I inc -I /usr/include/mono-2.0 -MMD -MF dep/Socket.d -std=c++17 -O3 -fno-stack-protector -fno-unroll-loops -fomit-frame-pointer -Wno-ignored-optimization-argument -c -o obj/Socket.o src/Socket.cpp
g++ -shared -flto -o libNonsense.so obj/Nonsense.o obj/Socket.o -Llib -lenet
/usr/bin/x86_64-linux-gnu-ld: obj/Socket.o: relocation R_X86_64_PC32 against symbol `_ZTISt13runtime_error@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC
/usr/bin/x86_64-linux-gnu-ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
makefile:22: recipe for target 'libNonsense.so' failed
make: *** [libNonsense.so] Error 1
答案 0 :(得分:1)
如错误消息所述,您需要使用-fPIC
重新编译。您当前的编译器命令未显示-fPIC
选项:
g++ -I inc -I /usr/include/mono-2.0 -MMD -MF dep/Socket.d -std=c++17 -O3 -fno-stack-protector -fno-unroll-loops -fomit-frame-pointer -Wno-ignored-optimization-argument -c -o obj/Socket.o src/Socket.cpp
顺便提一下,-flto
一样-编译时也必须指定此标志才能生效。