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>
命令在它们之间切换。
我仅通过添加 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>
命令在它们之间切换。