Linux 针对符号重新定位R_X86_64_PC32_ZTISt13runtime_error@@GLIBCXX_3.4在创建共享对象时无法使用;用-fPIC重新编译

Linux 针对符号重新定位R_X86_64_PC32_ZTISt13runtime_error@@GLIBCXX_3.4在创建共享对象时无法使用;用-fPIC重新编译,linux,ubuntu,gcc,Linux,Ubuntu,Gcc,我试图编译的项目并不复杂,只引用了标准库和一个自包含库(在另一个系统上编译一切都很好)。如标题所示,它甚至无法与标准库中的内容链接,因为其中的内容可能没有使用-fPIC编译。我不是自己构建的,也不想,用apt重新安装东西似乎无法解决“用-fPIC重新编译”的问题 我会说,我认为问题的一个可能来源是由于gcc multilib或更早安装的东西,但我认为这已经被清除了。我不知道,可能有什么内容被覆盖了,或者发生了冲突。甚至可能没有关系。有什么想法吗 运行Ubuntu 18.04 g++ -I inc

我试图编译的项目并不复杂,只引用了标准库和一个自包含库(在另一个系统上编译一切都很好)。如标题所示,它甚至无法与标准库中的内容链接,因为其中的内容可能没有使用
-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

正如错误消息所说,您需要使用
-fPIC
重新编译。当前编译器命令未显示
-fPIC
选项:

g++-I inc-I/usr/include/mono-2.0-MMD-MF dep/Socket.d-std=c++17-O3-fno堆栈保护器-fno展开循环-fomit帧指针-Wno忽略优化参数-c-o obj/Socket.o src/Socket.cpp


同样适用于
-flto
,编译时也必须指定此标志才能生效。

这是windows吗?缺少太多信息。我们需要知道平台、配置方式、典型的命令行、链接器命令等。
PKG\u CONFIG\u PATH
如果我们知道细节,可能会解决这个问题。我已经添加了一些上下文,除了配置,因为这个项目非常简单,
g++
的简单命令就足以构建它。我感觉有些东西安装不正确,因为编译这么简单的东西不应该引起任何类似的问题。请向我们展示您用于生成
obj/Socket.o
的命令。您需要按照错误消息中的说明执行操作。在编译源代码文件时添加
-fPIC
标志,在创建(链接)librussing.so库时也添加
-fPIC
。这基本上是对它的总结。奇怪的是,我以前做过这件事,但不知怎的它不起作用,但现在它起作用了。也许清理过程没有删除旧的对象文件。我在所有地方都添加了fPIC标志,但它不起作用,但现在似乎已经解决了。@Florian Weimer我也在使用g++,我得到了同样的错误。请查收