gpt4 book ai didi

linux - 重定位 R_X86_64_PC32 针对符号 _ZTISt13runtime_error@@GLIBCXX_3.4 不能在创建共享对象时使用;使用 -fPIC 重新编译

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:14 29 4
gpt4 key购买 nike

我正在尝试编译的项目一点也不复杂,除了标准库和一个独立的库(一切都在另一个系统上编译正常)之外,什么都不引用。正如标题所示,它甚至不能链接到标准库中的某些东西,因为那里的东西应该没有用 -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

最佳答案

显然,在 64 位平台上必须使用 -fPIcflags进行编译。如果您正在使用带有 32 位库的 linkink 制作 32 位项目;你不需要-fPIC。实际上,如果没有 -fPIC,动态链接器会重新计算全局变量和函数的地址(在编译步骤中事先不知道)。但是,在 64 位系统中,无法使用此技术,因为它需要提前猜测地址的大小。PIC(Position Independent Code),使用了更精密复杂的工艺。 https://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-libraries-on-x64用于解释。

关于linux - 重定位 R_X86_64_PC32 针对符号 _ZTISt13runtime_error@@GLIBCXX_3.4 不能在创建共享对象时使用;使用 -fPIC 重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51547552/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com