在 cmake 已预编译失败后,链接 CXX 可执行文件 worldserver 在 99% 编译时失败。
[ 99%] Linking CXX executable worldserver
/usr/bin/ld: ../../../deps/jemalloc/libjemalloc.a(jemalloc.c.o): relocation R_X86_64_32S against symbol `sz_size2index_tab' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: ../../../deps/jemalloc/libjemalloc.a(large.c.o): relocation R_X86_64_32S against symbol `sz_size2index_tab' can not be used when making a PIE object; recompile with -fPIC
等等
错误是:https://pastebin.com/pVEkzzNs
我正在运行最新的 Ubuntu 并尝试通过 SSH 安装最新的 AzerothCore(无自动安装程序)。
预期:一切都应该运行良好。 实际:二进制文件甚至没有被创建。
最佳答案
错误消息relocation R_X86_64_32S ... can not be used when making a PIE object; recompile with -fPIC
表明该项目很可能包含 libjemalloc.a
的预编译库未编译为 PIC 代码。由于 Ubuntu 最近默认转为编译位置无关可执行文件,因此使用默认工具链设置,所有进入可执行文件的对象都必须在 PIC 模式下编译。
我可能会与您尝试构建的项目的维护者联系,并通知他们此兼容性问题。同时,您也许可以通过设置 CMAKE_EXE_LINKER_FLAGS
来解决此问题。至-no-pie
(例如,编辑 ccmake
或 cmake-gui
中的变量 - 您可能必须启用“高级变量”的显示 - 或使用类似 cmake /path/to/source -DCMAKE_EXE_LINKER_FLAGS=-no-pie
在 cmake 命令行上指定它)。请注意,这确实会在一定程度上降低生成的可执行文件的安全性,因为内核将无法将地址空间随机化应用于基本可执行文件。
关于c++ - “链接 CXX 可执行文件 worldserver”失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54637025/