创建共享库时,不能使用针对符号_ZTISt13runtime_error @@ GLIBCXX_3.4的R_X86_64_PC32重定位;用-fPIC

时间:2018-07-26 21:10:54

标签: linux ubuntu gcc

我正在尝试编译的项目并不复杂,除了标准库和一个自包含的库(所有东西都可以在另一个系统上编译)之外,它什么都没有引用。如标题所示,它甚至不能链接到标准库中的内容,因为据推测其中没有使用-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

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一样-编译时也必须指定此标志才能生效。