【发布时间】: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时会发生什么