news 2026/8/9 14:08:14

记录一次cmake无法正确使用vcpkg的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
记录一次cmake无法正确使用vcpkg的问题

1.背景

环境:windows10 + VS2022

项目:cmake项目

包管理器:vcpkg

此前通过VS2022使用cmake项目都正常,包括设置cmake工具链文件为vcpkg,但是昨天使用VS2022配置cmake报错,find_package freetype库时找不到

#freetype find_package(Freetype REQUIRED) target_link_libraries(main PRIVATE Freetype::Freetype) # since CMake 3.10

已经通过vcpkg在本地安装了freetype,并且设置了环境变量:VCPKG_ROOT,

然后调试cmakelists.txt,发现CMAKE_TOOLCHAIN_FILE变量值是VS2022安装目录下子目录中的vcpkg.cmake

"D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\vcpkg\scripts\buildsystems\vcpkg.cmake",

这就不对了,我本地自己的vcpkg安装位置是其它位置,包括通过vcpkg安装的包。

2.方法论

首先有几种方法可以设置cmake工具链文件:

方法一:使用 Visual Studio 的 CMake 配置文件

Visual Studio 2019 16.10+ 推荐使用CMakePresets.json来管理默认配置。

  • 打开项目根目录,创建或编辑CMakePresets.json

  • configurePresets中添加:

{ "version": 3, "configurePresets": [ { "name": "x64-debug", "hidden": false, "generator": "Ninja", "description": "Debug build with vcpkg toolchain", "binaryDir": "${sourceDir}/out/build/${presetName}", "cacheVariables": { "CMAKE_TOOLCHAIN_FILE": "D:/vcpkg/scripts/buildsystems/vcpkg.cmake" } } ] }

方法二:使用 CMakeSettings.json

如果项目还在用旧的CMakeSettings.json

  • 在 Visual Studio 中选择配置 → 管理配置

  • 在编辑器中找到CMake 工具链文件,填入路径。

{ "configurations": [{ "name": "x64-Debug", "generator": "Visual Studio 15 2017", "configurationType" : "Debug", "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}", "cmakeCommandArgs": "", "buildCommandArgs": "-m -v:minimal", "variables": [{ "name": "CMAKE_TOOLCHAIN_FILE", "value": "D:\\src\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake" }] }] }

注意:新版VS推荐使用CMakePresets.json来管理默认设置,可以在VS的工具》选项中查看和配置:

方法三:在 CMakeLists.txt 中设置

如果你想在项目脚本中直接指定:

cmake_minimum_required(VERSION 3.20) # 必须在 project() 之前设置 set(CMAKE_TOOLCHAIN_FILE "D:/vcpkg/scripts/buildsystems/vcpkg.cmake") project(demo)

注意

  • 上述方法优先级命令行参数-DCMAKE_TOOLCHAIN_FILE=...的优先级最高,会覆盖配置文件。

  • 跨平台:不同平台可能需要不同的工具链文件,可以在CMakePresets.json中为每个平台定义不同的 preset。

  • 兼容性:Visual Studio 旧版本可能不支持CMakePresets.json,需使用CMakeSettings.json

3.排查思路

1)作者使用的是cmakepresets.json,在其中设置了CMAKE_TOOLCHAIN_FILE变量,无奈还是报错,

然后在VS2022中查看配置cmake时的输出信息,

命令行: "C:\WINDOWS\system32\cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "D:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\PROFESSIONAL\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja"-DCMAKE_TOOLCHAIN_FILE:STRING="D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\vcpkg/scripts/buildsystems/vcpkg.cmake"-DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:STRING="D:/git/3rdParty/cglib" -DCMAKE_MAKE_PROGRAM="D:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\PROFESSIONAL\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" "D:\git\cglib" 2>&1"

显然当前环境的环境变量:VCPKG_ROOT 已经覆盖了我本地设置的变量值,并且VS启动cmake时以-DCMAKE_TOOLCHAIN_FILE方式传递了该值(优先级最高),继续排查~

同时CmakeCache.txt中也是:

2)作者使用上述方法三设置,不管用,因为VS启动cmake时以-DCMAKE_TOOLCHAIN_FILE方式传递了该值(优先级最高),继续排查~

3)作者在VS2022的工具》选项中的vcpkg程序包管理器中设置,依然没有解决问题;

4.解决问题

好吧,虽然按论及来说咱没有使用cmakesetting.json,但还是配置下吧,注意cmakeToolchain变量值的设置,

{ "configurations": [ { "name": "x64-Release", "generator": "Ninja", "configurationType": "Release", "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${projectDir}\\out\\build\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}", "cmakeCommandArgs": "", "buildCommandArgs": "-v", "ctestCommandArgs": "", "cmakeToolchain": "D:/git/vcpkg/scripts/buildsystems/vcpkg.cmake" } ] }

同时配合上述方法三:

cmake_minimum_required(VERSION 3.20) # 必须在 project() 之前设置 set(CMAKE_TOOLCHAIN_FILE "D:/vcpkg/scripts/buildsystems/vcpkg.cmake") project(demo)

问题解决......

来看CmakeCache.txt

按理来说我的VS设置中不会使用CmakeSetting.json了,但是问题就是解决了......

当然还有一种逻辑更靠谱的办法是卸载VS自带的vcpkg,这样就不会与自己配置的起冲突了,

VS2022中工具》获取工具和功能:

5.参考

1)Installing and Using Packages Example: SQLite

https://github.com/MicrosoftDocs/vcpkg-docs/blob/main/vcpkg/examples/installing-and-using-packages.md#cmake

2)自定义 CMake 生成设置

https://learn.microsoft.com/zh-cn/cpp/build/customize-cmake-settings?view=msvc-170

3)CMAKE_TOOLCHAIN_FILE

https://cmake.com.cn/cmake/help/latest/variable/CMAKE_TOOLCHAIN_FILE.html

4)deepseek和微软Copilot

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 23:50:35

NCM音频解密革命:从加密牢笼到自由播放的终极指南

还在为那些被网易云音乐加密的NCM文件困扰吗?那些只能在特定播放器里才能欣赏的音乐,仿佛被关在了一个无形的牢笼中。今天,让我们一起探索音频解密技术的奥秘,实现格式转换的完美突破,让每一首心爱的歌曲都能在任何设备…

作者头像 李华
网站建设 2026/8/3 12:32:50

Zotero-SciPDF完全攻略:5分钟掌握智能文献下载神器

Zotero-SciPDF完全攻略:5分钟掌握智能文献下载神器 【免费下载链接】zotero-scipdf Download PDF from Sci-Hub automatically For Zotero7 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scipdf 在学术研究的道路上,获取文献PDF全文往往是…

作者头像 李华
网站建设 2026/7/31 3:42:02

Multisim汉化助力电子课程:零基础小白指南

让电路仿真不再“天书”:手把手教你用汉化版Multisim玩转电子课你有没有在实验室里见过这样的场景?一个学生盯着电脑屏幕皱眉半天,鼠标悬停在一个按钮上迟迟不敢点——就因为上面写着“Run Simulation”。他不是不会做实验,而是根…

作者头像 李华
网站建设 2026/7/27 7:33:55

PaddlePaddle镜像如何实现模型压力测试?Locust模拟请求

PaddlePaddle镜像与Locust结合实现AI模型压力测试 在当前AI应用快速落地的背景下,一个训练好的深度学习模型能否稳定支撑高并发请求,直接决定了它是否具备投产价值。尤其是在金融、电商、政务等对系统稳定性要求极高的场景中,模型服务上线前的…

作者头像 李华
网站建设 2026/7/31 3:59:58

Mermaid.js状态图实战手册:从零构建完整的状态追踪系统

Mermaid.js状态图实战手册:从零构建完整的状态追踪系统 【免费下载链接】mermaid 项目地址: https://gitcode.com/gh_mirrors/mer/mermaid Mermaid.js作为开源图表库的佼佼者,其状态图功能让复杂的系统状态转换变得直观易懂。无论您是软件工程师…

作者头像 李华