C++ 犰狳线性代数库链接器错误与 GCC

问题描述

仅通过添加标头(MacBook Pro 2020 上的 MacOSX 和随 Homebrew 安装的犰狳,代码是使用标准 CMake 配置编译的),GCC >=9 和 std>=11 出现以下错误 #include <armadillo> 到我的项目。

体系结构 x86_64 的未定义符号: “___emutls_v._ZN4arma19mt19937_64_instanceE”,引用自: __GLOBAL__sub_I_Test_HPP.cpp 在 Test_HPP.cpp.o ld:找不到架构 x86_64 的符号 collect2: 错误: ld 返回 1 个退出状态 make[2]: *** [Test_HPP] 错误 1 make[1]: *** [CMakeFiles/Test_HPP.dir/all] 错误 2

我尝试了各种技巧,包括优化标志,例如O2、O3 等,但最后添加了预处理器头 #define ARMA_DONT_USE_WRAPPER 显然现在解决了这个问题,但我需要一个解释才能感到安定。如果编译代码绝对需要上述预处理器,那么犰狳库维护者是否应该吸收库本身内部的宏?这种问题可能需要很长时间才能解决,因为它不是源于任何编程逻辑。

解决方法

预处理器指令 ARMA_DONT_USE_WRAPPER 禁用使用 thread_local 的代码,该代码依赖于 macOS 上 emutls 中的 gcc。根据犰狳的维护者的说法,这在 macOS 11 (Big Sur) 上似乎不受支持。如此处所示CMakeLists.txt

维护者 Commit 83e48f8c 在文件 include/armadillo_bits/arma_rng.hpp

中提供了相关的解决方法

我无法确认为什么它在 macOS 或 Homebrew 中不受支持,但从其他文档看来,尝试具有正确 TLS 支持的不同构建系统配置可能会解决问题,例如 ugrading gcc 或重建 { {1}} 与 gcc 开关。我正在使用 Catalina,我的 --enable-tls 版本与 Homebrew 一起安装是 gcc。如果您需要 11.1.0 版本 9,您可以使用 gcc 命令在它们之间切换。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...