【问题标题】:C++ armadillo linear algebra library linker error with GCCGCC 的 C++ 犰狳线性代数库链接器错误
【发布时间】:2021-08-16 05:03:28
【问题描述】:

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

【问题讨论】:

  • 你的构建主机是什么操作系统?
  • 将编译器配置为与犰狳运行时库链接,如 README 文件和犰狳questions page 中所述。对于 GCC 和 clang,使用 -larmadillo 链接,如下所示:g++ code.cpp -o code -O2 -larmadillo
  • 当然 -larmadillo 用于链接,如果没有它,即使使用 WRAPPER 标头也不会链接
  • fwiw 我认为您为模拟 TLS 功能提供的符号在您的 gcc 副本中不可用。可能是因为它是在没有您的 gcc 维护者支持的情况下构建的
  • 可能,如果这可能意味着缺少该 TLS 功能,则使用默认 Homebrew 设置安装 GCC,尽管我对此高度怀疑。当我添加包装器 #define ARMA_DONT_USE_WRAPPER 时会发生什么

标签: c++ linker armadillo


【解决方案1】:

预处理器指令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 或重建 gcc使用--enable-tls 开关。我正在使用 Catalina,我的 gcc 与 Homebrew 一起安装的版本是 11.1.0。如果您需要gcc 版本 9,您可以使用brew link <package>@<version> 命令在它们之间切换。

【讨论】:

  • 这是对该主题的出色分析和研究。我在 Big Sur,这使得断言一致
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多