Ubuntu下链接Armadillo库遇dgemm_未定义引用错误的求助
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")
2. 使用target_link_libraries配置链接依赖
找到你定义可执行文件的代码(比如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

