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

C++ armadillo linear algebra library linker error with GCC

我仅通过添加 header(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 等,但最后添加预处理器 header #define ARMA_DONT_USE_WRAPPER 显然现在解决了这个问题,但我需要一个解释才能安定下来。如果上述 pre-processor 是编译代码所必需的,那么犰狳库维护者是否应该在库本身中吸收宏?此类问题可能需要很长时间才能解决,因为它并非源于任何编程逻辑。

预处理器指令 ARMA_DONT_USE_WRAPPER 禁用使用 thread_local 的代码,这取决于 macOS 上 gcc 中的 emutls。根据 Armadillo 的维护者,这在 macOS 11 (Big Sur) 上似乎不受支持。如图所示CMakeLists.txt.

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

中提供了相关的解决方法

我无法确认为什么它在 macOS 或 Homebrew 中不受支持,但从其他文档看来,尝试使用正确的 TLS 支持的不同构建系统配置可能会解决问题,例如升级 gcc 或者也许使用 --enable-tls 开关重建 gcc。我使用的是 Catalina,我用 Homebrew 安装的 gcc 版本是 11.1.0。如果您需要 gcc 版本 9,您可以使用 brew link <package>@<version> 命令在它们之间切换。