通过Conan安装OpenBLAS后CMake无法找到BLAS库的问题排查
问题:CMake无法找到通过Conan安装的OpenBLAS库
我正在开发一个基于Fortran语言、依赖BLAS库的项目,已通过Conan成功安装OpenBLAS,但CMake始终无法找到BLAS库。
配置信息
CMakeLists.txt
cmake_minimum_required(VERSION 3.6.0) project(test Fortran) find_package(BLAS REQUIRED)
conanfile.txt
[requires] openblas/0.3.26 [generators] CMakeDeps CMakeToolchain [layout] cmake_layout
构建批处理脚本
RMDIR /S /Q build MKDIR build CD build SET "PATH=C:\Windows\System32\;C:\Program Files\CMake\bin;C:\Users\%USERNAME%\AppData\Roaming\Python\Python312\Scripts\;" CALL "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" xcopy /s ..\conanfile.txt conanfile.txt conan install ..\conanfile.txt --build=missing cmake -G "Ninja" .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_BUILD_TYPE=Release CD ..
报错信息
CMake Error at C:/Program Files/CMake/share/cmake-3.28/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find BLAS (missing: BLAS_LIBRARIES)
原因分析
- CMake原生
FindBLAS模块不兼容Conan配置:CMake自带的FindBLAS模块默认按系统路径、环境变量等逻辑搜索库,不会自动识别Conan通过CMakeDeps生成的OpenBLAS配置文件,而Conan安装的包位于本地缓存或指定构建目录,不在默认搜索路径内。 - 未应用Conan生成的工具链文件:使用
CMakeToolchain生成器时,必须在CMake调用时指定对应的工具链文件,否则CMake无法感知Conan管理的依赖环境。
解决方法
方法一:直接使用Conan生成的OpenBLAS目标(推荐)
修改CMakeLists.txt,跳过原生find_package(BLAS),直接调用Conan生成的OpenBLAS配置:
cmake_minimum_required(VERSION 3.6.0) project(test Fortran) # 加载Conan生成的OpenBLAS配置 find_package(OpenBLAS REQUIRED) # 假设存在可执行目标test,链接OpenBLAS库 add_executable(test your_source.f90) target_link_libraries(test PRIVATE OpenBLAS::OpenBLAS)
方法二:让原生FindBLAS识别Conan安装的库
修改批处理脚本中的CMake调用命令,添加Conan生成的工具链文件参数:
cmake -G "Ninja" .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
工具链文件会引导CMake读取Conan生成的依赖配置,此时原生find_package(BLAS)就能找到OpenBLAS。
额外注意事项
- 确认build目录下已生成
conan_toolchain.cmake和OpenBLASConfig.cmake文件,这是Conan安装成功的标志。 - 避免Intel oneAPI环境干扰:如果环境中存在Intel MKL,CMake的
FindBLAS可能优先选择MKL,可通过设置环境变量BLAS_VENDOR=OpenBLAS强制指定使用OpenBLAS。
内容的提问来源于stack exchange,提问作者Foad S. Farimani
相关产品推荐
相关产品推荐

