问题描述
仅通过添加标头(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
命令在它们之间切换。