You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下链接Armadillo库遇dgemm_未定义引用错误的求助

解决Armadillo链接时dgemm_未定义的问题

这个错误的核心原因是你把链接库的参数放在了编译阶段的标志里,而且库的链接顺序也可能存在问题。下面是具体的解决步骤:

1. 分离编译标志和链接库设置

你当前把-larmadillo -lblas -lm -llapack写在CMAKE_CXX_FLAGS里,但这个变量是给编译器传递编译阶段参数的,链接库的配置应该单独放在链接阶段处理。先把这些链接库参数从CMAKE_CXX_FLAGS中移除,保留纯编译选项:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wextra -Wno-long-long -std=c++14 -fext-numeric-literals -Wno-cast-function-type -ffast-math")

找到你定义可执行文件的代码(比如add_executable(bayesian_estimation bayesian_estimation.cpp)),然后添加链接库的配置,这里有两种方式:

方式一:手动指定依赖库

注意库的链接顺序很重要——调用者在前,被调用者在后。dgemm_是BLAS库提供的符号,Armadillo会调用它,所以顺序应该是:

target_link_libraries(bayesian_estimation PRIVATE armadillo blas lapack m)

方式二:用CMake的find_package自动处理(推荐)

CMake的find_package可以自动检测Armadillo的安装路径,并帮你处理它依赖的BLAS/LAPACK库,不需要手动指定所有依赖:

# 查找Armadillo库
find_package(Armadillo REQUIRED)
# 添加Armadillo的头文件路径
include_directories(${ARMADILLO_INCLUDE_DIRS})
# 链接Armadillo及其依赖库到你的目标
target_link_libraries(bayesian_estimation PRIVATE ${ARMADILLO_LIBRARIES})

3. 确认BLAS/LAPACK的开发包已安装

虽然你说已经安装了BLAS和LAPACK,但要确保安装的是开发版本(包含头文件和链接库文件),而不是仅运行时库:

sudo apt-get install libblas-dev liblapack-dev

为什么原来的方式会出错?

CMAKE_CXX_FLAGS是传递给g++等编译器的编译阶段参数,当你在这里加入-lxxx时,编译器会在编译单个源文件时就尝试链接这些库,此时还没有生成完整的目标文件,而且库的顺序如果不对,就会导致像dgemm_这样的符号无法被找到。而target_link_libraries是CMake专门用于链接阶段的配置,它会确保库的顺序正确,并且在所有目标文件生成后再进行链接操作。

内容的提问来源于stack exchange,提问作者Andre Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:37:51