Windows下使用CMake链接OpenBLAS出现cblas_*未定义引用问题
解决方案:正确链接OpenBLAS+LAPACK适配SAF的CMake配置
问题根源在于:
- 默认通过FetchContent拉取的LAPACK使用的是参考BLAS,仅提供Fortran接口的BLAS函数(如
sgemm),没有SAF需要的CBLAS接口(带cblas_前缀的函数)。 - 你之前尝试的目标名称
openblas/libopenblas不存在,因为默认LAPACK构建不会生成OpenBLAS相关目标。
正确的CMake配置步骤
1. 优先通过FetchContent拉取OpenBLAS+LAPACK
先单独拉取OpenBLAS(自带完整CBLAS实现),再让LAPACK基于OpenBLAS构建,自动解决接口匹配问题:
include(FetchContent) # 拉取OpenBLAS(指定合适版本) FetchContent_Declare( openblas GIT_REPOSITORY https://github.com/xianyi/OpenBLAS.git GIT_TAG v0.3.26 ) # 配置OpenBLAS构建选项(按需调整) set(BUILD_SHARED_LIBS OFF) # 静态库,改为ON则生成动态库 set(USE_OPENMP ON) # 启用OpenMP加速(可选) set(CMAKE_Fortran_COMPILER gfortran) # MinGW下需指定Fortran编译器 FetchContent_MakeAvailable(openblas) # 拉取LAPACK并指定使用OpenBLAS作为BLAS后端 FetchContent_Declare( lapack GIT_REPOSITORY https://github.com/Reference-LAPACK/lapack.git GIT_TAG v3.12.0 ) set(BLAS_VENDOR OpenBLAS) # 强制LAPACK使用OpenBLAS set(LAPACK_BUILD_TESTING OFF) # 关闭测试,加快构建速度 FetchContent_MakeAvailable(lapack) # 链接你的目标与依赖库 target_link_libraries(dev_example PUBLIC saf::saf # 假设SAF已通过find_package或FetchContent导入 OpenBLAS::OpenBLAS # OpenBLAS官方导出的目标,自动包含头文件和库 LAPACK::LAPACK # LAPACK官方导出的目标 )
2. 使用预编译OpenBLAS的配置方式
如果已有预编译的libopenblas.a,需手动导入OpenBLAS目标,再让LAPACK依赖它:
# 导入预编译OpenBLAS find_path(OPENBLAS_INCLUDE_DIR NAMES cblas.h PATHS "你的OpenBLAS头文件路径") find_library(OPENBLAS_LIBRARY NAMES openblas PATHS "你的OpenBLAS库文件路径") add_library(OpenBLAS::OpenBLAS STATIC IMPORTED) set_target_properties(OpenBLAS::OpenBLAS PROPERTIES IMPORTED_LOCATION "${OPENBLAS_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${OPENBLAS_INCLUDE_DIR}" ) # 拉取LAPACK并指定BLAS后端 include(FetchContent) FetchContent_Declare( lapack GIT_REPOSITORY https://github.com/Reference-LAPACK/lapack.git GIT_TAG v3.12.0 ) set(BLAS_VENDOR OpenBLAS) set(LAPACK_BUILD_TESTING OFF) FetchContent_MakeAvailable(lapack) # 链接目标 target_link_libraries(dev_example PUBLIC saf::saf OpenBLAS::OpenBLAS LAPACK::LAPACK )
关键说明
- OpenBLAS自带CBLAS实现,能提供SAF需要的
cblas_sgemm等符号,解决未定义引用问题。 - 使用官方导出的
OpenBLAS::OpenBLAS和LAPACK::LAPACK目标,CMake会自动处理头文件路径、库链接顺序等细节,避免手动指定路径的错误。 - MinGW-W64环境下需确保安装了gfortran,OpenBLAS构建依赖Fortran编译器。
内容的提问来源于stack exchange,提问作者TheBaum
相关产品推荐
相关产品推荐

