news 2026/4/23 11:30:38

记录一次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/4/23 9:58:00

如何在IDEA中实现高效阅读与工作并行?Thief-Book插件深度解析

如何在IDEA中实现高效阅读与工作并行?Thief-Book插件深度解析 【免费下载链接】thief-book-idea IDEA插件版上班摸鱼看书神器 项目地址: https://gitcode.com/gh_mirrors/th/thief-book-idea 在当今快节奏的开发环境中,如何在紧张的编码工作间隙保…

作者头像 李华
网站建设 2026/4/23 9:59:03

告别格式束缚:ncmdump让你的网易云音乐真正自由

在数字音乐时代,我们下载的每一首歌曲都承载着珍贵回忆,但当这些音乐被格式限制,只能在特定平台播放时,那种无奈感令人沮丧。ncmdump作为一款专业的NCM格式转换工具,为你打破平台壁垒,让音乐回归自由本质。…

作者头像 李华
网站建设 2026/4/23 9:52:28

如何快速配置ViGEmBus虚拟手柄驱动:终极兼容性解决方案

如何快速配置ViGEmBus虚拟手柄驱动:终极兼容性解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为游戏手柄兼容性问题烦恼吗&#xf…

作者头像 李华
网站建设 2026/4/23 9:48:53

小红书无水印下载终极指南:3步轻松搞定批量采集

小红书无水印下载终极指南:3步轻松搞定批量采集 【免费下载链接】XHS-Downloader 免费;轻量;开源,基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader 想要…

作者头像 李华
网站建设 2026/4/23 11:19:29

六音音源完整修复指南:快速解决洛雪音乐播放问题

六音音源完整修复指南:快速解决洛雪音乐播放问题 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 针对洛雪音乐升级后出现的音源失效问题,六音音源修复版提供了一套完整的技…

作者头像 李华
网站建设 2026/4/22 13:40:02

Raspberry Pi 4 与传感器通信:串口应用实例

树莓派4串口通信实战:从零搭建温湿度传感器数据采集系统你有没有遇到过这样的场景?手头有一个支持UART输出的工业级温湿度传感器,想把它接到树莓派上做实时监测,结果发现串口要么打不开,要么收到一堆乱码。别急——这几…

作者头像 李华