带有GCC的C++armadillo线性代数库链接器错误



GCC出现以下错误>9和std>11只需添加标题(MacBook Pro 2020上的MacOSX和安装了Homebrew的armadillo,代码是用标准CMake配置编译的(#include <armadillo>我的项目。

体系结构x86_64的未定义符号:&quot___emutls_v_ZN4orma19mt19937_64_instanceE";,引用自:__Test_HPP.cpp.o中的GLOBAL__sub_I_Test_HPP.cppld:找不到体系结构x86_64的符号collect2:错误:ld返回1退出状态make[2]:***[Test_HPP]错误1make[1]:***[CMakeFiles/Test_HPP.dir/all]错误2

我尝试了各种技巧,包括优化标志,例如O2、O3等,但最终添加了预处理器标头#define ARMA_DONT_USE_WRAPPER显然暂时解决了这个问题,但我需要一个解释才能感觉解决。如果编译代码绝对需要上述预处理器,那么armadillo库维护人员是否应该吸收库本身中的宏?这类问题可能需要花费大量时间来解决,因为它不是源自任何编程逻辑。

预处理器指令ARMA_DONT_USE_WRAPPER禁用使用thread_local的代码,该代码依赖于macOS上gcc中的emutls。据Armadillo的维护人员称,这在macOS 11(Big Sur(上似乎不受支持。如这里所示CMakeLists.txt.

维护人员在include/armadillo_bits/arma_rng.hpp文件中提交83e48f8c提供了一个相关的解决方法

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

最新更新