【发布时间】:2018-07-26 21:10:54
【问题描述】:
我尝试编译的项目并不复杂,只引用标准库和一个自包含库(一切都可以在另一个系统上编译)。如标题所示,它甚至无法链接到标准库中的某些内容,因为据说那里的内容没有使用-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
【问题讨论】:
-
这是窗户吗?
-
缺少太多信息。我们需要了解平台、您的配置方式、典型命令行、链接器命令等。如果我们知道具体细节,
PKG_CONFIG_PATH可能会解决问题。 -
我已经添加了更多的上下文,除了配置,因为这个项目非常简单,
g++的简单命令就足以构建它。我感觉有些东西安装不正确,因为编译这么简单的东西应该不会导致这样的问题。 -
请告诉我们你用来构建
obj/Socket.o的命令。 -
您需要按照错误消息中的说明进行操作。在编译源代码文件时添加
-fPIC标志,并在创建(链接)libNonsense.so 库时添加-fPIC。