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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:25:59