0

0

如何使用vcpkg的清单模式(manifest mode)管理c++项目依赖? (声明式包管理)

穿越時空

穿越時空

发布时间:2026-01-09 14:09:34

|

331人浏览过

|

来源于php中文网

原创

vcpkg manifest mode是vcpkg自2022年起主推的声明式依赖管理方式,以项目根目录的vcpkg.json替代手动install命令,实现per-project、per-triplet隔离;传统方式将包装入全局vcpkg/installed/路径,易引发ABI冲突。

如何使用vcpkg的清单模式(manifest mode)管理c++项目依赖? (声明式包管理)

什么是 vcpkg manifest mode,它和传统方式有什么根本区别

vcpkg manifest mode 是 vcpkg 从 2022 年起主推的声明式依赖管理方式,核心是用 vcpkg.json 文件替代手动调用 vcpkg install。它不是“额外功能”,而是让 vcpkg 真正成为项目级依赖工具的关键切换——依赖绑定到项目目录,而非全局或用户环境。

传统方式(vcpkg install zlib x64-windows)会把包装进 vcpkg/installed/ 全局路径,多个项目共享同一份二进制,极易引发 ABI 冲突或版本漂移;manifest mode 则为每个项目生成独立的 vcpkg_installed/ 目录,并通过 CMake 工具链自动注入依赖,实现 per-project、per-triplet 隔离。

如何初始化并正确编写 vcpkg.json

vcpkg.json 必须放在项目根目录(即 CMakeLists.txt 同级),且必须包含 nameversiondependencies 字段。vcpkg 不接受空依赖或缺失字段,否则 vcpkg install 会直接报错退出。

  • name 必须是合法标识符(仅含字母、数字、下划线,不能以数字开头),且与项目实际名称一致——CMake 导入时会校验该名称是否匹配 find_package() 调用
  • dependencies 中的包名必须是 vcpkg registry 中存在的端口名(如 fmtboost-system),不支持别名或自定义别名
  • 若需指定 triplet(如 x64-windows-static-md),**不能写在 vcpkg.json 里**,而应在 CMake 配置阶段传入,例如:-DVCPKG_TARGET_TRIPLET=x64-windows-static-md
{
  "name": "myapp",
  "version": "0.1.0",
  "dependencies": [
    "fmt",
    {
      "name": "boost-system",
      "features": ["regex"]
    }
  ]
}

CMakeLists.txt 怎么对接 manifest mode?

关键不是手动 find_package(),而是启用 vcpkg 的自动集成机制:必须通过 vcpkg 提供的 CMake 工具链文件触发依赖解析。否则 vcpkg.json 形同虚设。

Ink For All
Ink For All

AI写作和营销助手,精心设计的 UI

下载

立即学习C++免费学习笔记(深入)”;

  • 必须在 cmake 命令中显式指定 -DCMAKE_TOOLCHAIN_FILE 指向 vcpkg 的 toolchain(如 /path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
  • 无需在 CMakeLists.txt 中调用 vcpkg_configure_cmakeinclude(vcpkg) —— 这些是旧模式遗留,manifest mode 下会干扰自动发现
  • find_package(fmt CONFIG REQUIRED) 可直接使用,vcpkg 会在 configure 阶段自动注册 fmtConfig.cmakeCMAKE_PREFIX_PATH
  • 若项目含子目录(如 src/test/),确保所有 add_executable() / add_library() 调用前已执行 find_package(),否则链接会失败

常见失败场景和排查要点

manifest mode 下错误信息往往藏在 CMake configure 日志末尾,而不是 vcpkg 命令输出里。最常踩的坑不是语法错,而是路径和生命周期错位。

  • 运行 vcpkg install 后没看到 vcpkg_installed/ 目录?检查当前工作目录是否为 vcpkg.json 所在目录,且该目录下有 CMakeLists.txt —— vcpkg 会扫描父目录找 CMakeLists.txt,但不会跨 Git 工作区边界
  • CMake 报错 “Could not find fmt”?确认 find_package(fmt CONFIG REQUIRED)CONFIG 关键字存在(否则 fallback 到 module 模式,找不到 Findfmt.cmake
  • 链接时报 undefined symbol?大概率是 triplet 不匹配:CMake 默认用 x64-windows,但 vcpkg.json 依赖的包可能只构建了 x64-windows-static —— 此时必须统一指定 -DVCPKG_TARGET_TRIPLET
  • CI 构建失败提示 “no suitable port found”?检查 vcpkg commit 是否固定(推荐用 git submodule add vcpkg 并 checkout 稳定 tag),避免 registry 更新导致端口名变更

manifest mode 的复杂点不在配置本身,而在于它把“依赖生命周期”交还给了项目结构——一旦 vcpkg.json 移动、CMakeLists.txt 重命名、或 toolchain 路径写错,整个链路就静默失效,且错误提示极不直观。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

408

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

276

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

252

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

23

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号