Windows下VCPKG+CMake配置BLAS失败:如何解决找不到库问题?
Windows下CMake+VCPKG链接BLAS库失败的排查与解决
环境配置
- Windows 10
- CMake 3.26
- Microsoft Visual Studio 2022
- Intel oneAPI
- VCPKG
操作流程
- 克隆并初始化VCPKG:
git clone https://github.com/microsoft/vcpkg.git cd vcpkg && bootstrap-vcpkg.bat set "VCPKG_ROOT=C:\path\to\vcpkg"
- 创建
CMakeLists.txt:
cmake_minimum_required(VERSION 3.15) project(test Fortran) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /Qipo /O3 /MP /Qdiag-disable:10448 /Qdiag-disable:warn") find_package(BLAS REQUIRED)
- 创建
CMakePresets.json:
{ "version": 2, "configurePresets": [ { "name": "default", "generator": "Ninja", "binaryDir": "${sourceDir}/build", "cacheVariables": { "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" } } ] }
- 执行构建脚本:
SET "PATH=C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;%VCPKG_ROOT%;" CALL "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" RMDIR /S /Q build DEL vcpkg.json vcpkg-configuration.json vcpkg new --application vcpkg add port blas cmake --preset=default
错误信息
CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find BLAS (missing: BLAS_LIBRARIES) Call Stack (most recent call first): C:/Program Files/Microsoft Visual Studio/2022/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.26/Modules/FindBLAS.cmake:1346 (find_package_handle_standard_args) build/vcpkg_installed/x64-windows/share/blas/vcpkg-cmake-wrapper.cmake:7 (_find_package) C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake:813 (include) CMakeLists.txt:12 (find_package)
已尝试直接在命令行和CMakeLists.txt中指定CMAKE_TOOLCHAIN_FILE,问题未解决。
核心疑问
当前配置下如何成功找到并链接BLAS库?哪些环节可能遗漏或出错?
可行解决方向
1. 安装具体BLAS实现而非虚拟端口
VCPKG的blas是虚拟端口,仅作为抽象层,需指定具体实现(如openblas、intel-mkl)。修改构建脚本中的安装命令:
# 安装OpenBLAS vcpkg add port openblas # 或安装Intel MKL版本的BLAS vcpkg add port intel-mkl
重新执行cmake配置即可。
2. 改用VCPKG的CONFIG模式查找库
CMake自带的FindBLAS模块可能与VCPKG的配置冲突,在CMakeLists.txt中替换查找方式:
cmake_minimum_required(VERSION 3.15) project(test Fortran) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /Qipo /O3 /MP /Qdiag-disable:10448 /Qdiag-disable:warn") # 使用CONFIG模式直接查找VCPKG安装的BLAS配置 find_package(blas CONFIG REQUIRED)
3. 隔离Intel oneAPI环境影响
Intel oneAPI的环境脚本可能覆盖BLAS相关变量,导致CMake优先查找Intel自带库。可尝试:
- 调整脚本执行顺序:先初始化VCPKG,再调用Intel oneAPI的
setvars.bat - 或在CMake中显式指定VCPKG安装的BLAS路径:
set(BLAS_ROOT "${CMAKE_CURRENT_BINARY_DIR}/vcpkg_installed/x64-windows") find_package(BLAS REQUIRED)
4. 明确VCPKG三元组
确保系统架构与VCPKG目标三元组匹配,在CMakePresets.json中添加三元组指定:
{ "version": 2, "configurePresets": [ { "name": "default", "generator": "Ninja", "binaryDir": "${sourceDir}/build", "cacheVariables": { "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", "VCPKG_TARGET_TRIPLET": "x64-windows" } } ] }
5. 直接链接VCPKG导出的目标
找到BLAS目标后,在CMake中直接链接到你的可执行文件:
# 假设你的可执行目标名为test add_executable(test your_source.f90) target_link_libraries(test PRIVATE blas::blas)
内容的提问来源于stack exchange,提问作者Foad S. Farimani
相关产品推荐
相关产品推荐

