目录

1.简介

2.安装

3.常用命令

4.与项目集成

5.vcpkg的工作原理

5.1.包索引:ports 系统(定义库的 “元信息”)

5.2.源码获取:从 “地址” 到 “本地缓存”

5.3.编译构建:按 “triplet” 定制目标

5.4.安装布局:按 “triplet” 隔离文件

5.5.项目集成:让构建系统 “找到” 库

6.常见问题

7.总结

官方资源矩阵


1.简介

        vcpkg 是微软开发的 C++ 包管理工具,旨在简化跨平台 C++ 库的获取、编译和集成过程。它解决了 C++ 开发中 “库版本不一致、编译配置复杂、跨平台适配难” 等痛点,支持 Windows、Linux、macOS 等主流系统,可与 CMake、Visual Studio 等工具无缝集成。

        为什么使用 vcpkg?

  • 在特选注册表中有超过 2300 个开源库可供选择,这些库会定期生成,用于验证 ABI 兼容性
  • 使用自己的自定义库包创建自定义库注册表
  • 适用于 Windows、macOS 和 Linux 的一致的跨平台体验
  • 使用任何生成和项目系统轻松将库添加到项目
  • 从源生成依赖项或下载预生成的 ABI 验证二进制文件,默认提供 70 多个配置,并可针对特定要求进行无限自定义
  • 通过独特的版本控制设计,防止依赖项之间出现版本冲突和菱形依赖问题
  • 对于 MSBuild 和 CMake 用户:自动与生成环境集成,打造无缝获取依赖项的体验
  • 受到学生、开源开发人员、业余爱好者和专业人士的信任,包括一些大型企业

        核心功能

  1. 自动管理库依赖:安装库时自动下载并编译其依赖项(如安装openssl时自动处理zlib等依赖)。
  2. 跨平台一致性:同一套命令可在 Windows、Linux、macOS 上安装相同版本的库,保证开发环境一致。
  3. 灵活的目标配置:支持不同架构(x86/x64/arm)、编译类型(Debug/Release)、链接方式(静态 / 动态)。
  4. 与构建系统集成:无缝对接 CMake、MSBuild,无需手动设置库路径。

2.安装

1.Windows 安装

# 克隆仓库(需Git)
git clone https://github.com/microsoft/vcpkg
cd vcpkg# 运行 bootstrap 脚本(生成vcpkg可执行文件)
.\bootstrap-vcpkg.bat# 验证安装
.\vcpkg --version

2.Linux/macOS 安装

# 克隆仓库
git clone https://github.com/microsoft/vcpkg
cd vcpkg# 运行bootstrap脚本
./bootstrap-vcpkg.sh# 验证安装
./vcpkg --version

安装完成后,建议将vcpkg目录添加到系统PATH,方便全局调用。

3.常用命令

1.基本操作

命令功能
vcpkg search <库名>

搜索库(如vcpkg search boost-asio),支持正则表达式

如:vcpkg search "boost.*asio"

vcpkg install <库名>:<triplet>

安装指定库(triplet指定平台,如x64-windows),如:

vcpkg install zlib:x64-windows-static

vcpkg remove <库名>卸载库
vcpkg list

列出已安装的库,如:

vcpkg list --x-tree

vcpkg update检查可更新的库
vcpkg upgrade

更新所有已安装的库,如:

vcpkg upgrade --no-dry-run

vcpkg export

导出二进制供分发,如:

vcpkg export boost --zip

2.关键概念:triplet

triplet是 vcpkg 用于指定目标平台、架构、链接方式的标识,格式为<arch>-<os>-<link>,常见值:

  • x64-windows:Windows x64,动态链接(默认)
  • x64-windows-static:Windows x64,静态链接
  • x64-linux:Linux x64
  • arm64-osx:macOS ARM64(M 系列芯片)

3.安装示例

# 安装Boost.Asio(Windows x64,动态链接)
vcpkg install boost-asio:x64-windows# 安装OpenSSL(Linux x64,静态链接)
vcpkg install openssl:x64-linux-static# 安装多个库(自动处理依赖)
vcpkg install fmt spdlog:x64-windows

4.与项目集成

1.CMake 项目(推荐)

CMakeLists.txt中通过CMAKE_TOOLCHAIN_FILE指定 vcpkg 的工具链:

# 假设vcpkg安装在C:\vcpkg
set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake")
project(MyProject)# 直接find_package使用已安装的库
find_package(Boost REQUIRED COMPONENTS asio)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE Boost::asio)

编译时无需手动指定库路径,CMake 会自动通过 vcpkg 找到依赖。

2.Visual Studio 项目

# 将vcpkg集成到所有VS项目(管理员权限)
vcpkg integrate install# 取消集成
vcpkg integrate remove

集成后,VS 会自动识别 vcpkg 安装的库,直接#include并链接即可。

3.清单模式(Manifest )模式(推荐用于项目依赖管理)

在项目根目录创建vcpkg.json,声明依赖:

// vcpkg.json
{"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json","name": "my-game-engine","version": "1.3.0","dependencies": ["entt",                            // 隐式最新版{ "name": "glfw3", "version>=": "3.3" },  // 版本约束{"name": "spdlog","features": ["fmt"]              // 启用可选特性}],"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc" // Git提交锁定
}

编译时 vcpkg 会自动安装vcpkg.json中声明的依赖,确保团队成员使用相同版本的库。

5.vcpkg的工作原理

vcpkg 的核心目标是自动化 C++ 库的获取、编译、安装和项目集成,其工作原理可通过 “包索引→源码获取→编译构建→安装布局→项目集成” 五个核心环节解析:

5.1.包索引:ports 系统(定义库的 “元信息”)

vcpkg 通过 ports 目录 管理所有支持的库,每个库对应一个独立的子目录(如 ports/boost-asio),内含描述库信息的关键文件:

  • portfile.cmake:核心脚本,定义库的下载地址(Git 仓库、压缩包 URL)、校验信息(SHA512 哈希,确保源码完整性)、编译参数(CMake 选项、补丁文件)、依赖关系(如 boost-asio 依赖 boost-system)等。
  • vcpkg.json:库的元数据(名称、版本、许可证等),用于版本管理和依赖解析。
  • 补丁文件(可选):如 0001-fix-compile-error.patch,解决特定平台的编译问题(如 Windows/Linux 兼容性)。

当用户执行 vcpkg install <库名> 时,vcpkg 首先通过 ports 目录定位该库的 portfile.cmake,获取构建所需的全部信息。

5.2.源码获取:从 “地址” 到 “本地缓存”

根据 portfile.cmake 中的配置,vcpkg 执行以下步骤获取源码:

1) 解析下载地址:支持 Git 仓库(带分支 / 标签)、HTTP/HTTPS 压缩包(.tar.gz/.zip)等。

2) 校验完整性:下载后通过 portfile.cmake 中定义的 SHA512 哈希值校验源码,防止篡改或损坏。

3) 缓存源码:将源码解压 / 克隆到 vcpkg/downloads 目录,后续安装同一版本时直接复用,避免重复下载。

5.3.编译构建:按 “triplet” 定制目标

vcpkg 的核心能力之一是跨平台编译,通过 triplet(目标标识) 控制编译参数,确保库适配指定平台。

1) triplet 的作用

triplet 是一个字符串(如 x64-windowsarm64-linux-static),编码了三个关键信息:

  • 架构x64(64 位)、x86(32 位)、arm64(ARM 64 位)等;
  • 操作系统windowslinuxosx(macOS)等;
  • 链接方式:默认动态链接(如 x64-windows),-static 后缀表示静态链接(如 x64-linux-static)。

vcpkg 会根据 triplet 加载对应的配置文件(如 triplets/x64-windows.cmake),设置编译工具链(编译器路径、标准库)、宏定义(如 _WIN32__linux__)等。

2) 依赖递归编译

若库 A 依赖库 B,vcpkg 会:

  1. 先检查库 B 是否已安装(按当前 triplet);
  2. 若未安装,自动触发库 B 的编译流程(重复 “源码获取→编译” 步骤);
  3. 待库 B 安装完成后,再编译库 A,并在编译时自动链接库 B 的头文件和库文件。

3) 构建系统适配

vcpkg 支持多种构建系统(CMake、MSBuild、Make、Autotools 等),通过 portfile.cmake 中的脚本适配:

  • 对 CMake 库:调用 cmake 并传入 triplet 对应的工具链;
  • 对 Make 库:调用 make 并设置 CC/CXX 编译器路径;
  • 对 Visual Studio 项目:调用 msbuild 并指定平台(如 x64)和配置(Debug/Release)。

5.4.安装布局:按 “triplet” 隔离文件

编译完成后,vcpkg 将库文件安装到 vcpkg/installed 目录,按 triplet 分类存储,确保不同平台 / 配置的库不冲突。典型目录结构如下:

installed/
├─ x64-windows/           # triplet 为 x64-windows 的库
│  ├─ include/            # 头文件(如 boost/asio.hpp)
│  ├─ lib/                # 动态库(.dll.a 或 .lib)
│  ├─ bin/                # 可执行文件(如工具类库)
│  └─ share/              # 配置文件(如 CMake 模块)
└─ x64-linux-static/      # triplet 为 x64-linux-static 的库├─ include/└─ lib/                # 静态库(.a)

这种布局让项目可以根据自身目标平台,精准引用对应 triplet 的库文件。

5.5.项目集成:让构建系统 “找到” 库

第4章节,与项目集成已经讲了,就不这里赘述了。

6.常见问题

1)安装失败:检查网络(需访问 GitHub,设置代理:set HTTP_PROXY=http://127..0.0.1:1080)、依赖工具(如 CMake、编译器)是否安装。

2)库版本冲突:通过vcpkg install <库名>=<版本>指定版本(如vcpkg install boost-asio=1.78.0)。

3)静态 / 动态链接切换:通过triplet区分(如x64-windows-static强制静态链接)。如:安装对应VS组件:vcpkg env --triplet=x64-windows

7.总结

优势总结:

  • 简化流程:一键安装复杂库(如 Boost、OpenCV),无需手动编译。
  • 跨平台统一:一套命令适配多系统,避免 “在 Windows 能编,Linux 编不过” 的问题。
  • 版本可控:支持指定库版本,配合 Manifest 模式可固化项目依赖。

vcpkg 已成为 C++ 开发的主流包管理工具,尤其适合需要跨平台开发或依赖众多第三方库的项目(如 FastDDS、ROS 2 等)。

官方资源矩阵

  • 📚 文档中心:Page Redirection
  • 🚀 GitHub 仓库:microsoft/vcpkg
  • 📊 包搜索引擎:vcpkg.io/packages
  • 💬 社区支持:GitHub Discussions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92157.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92157.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92157.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinCC通过无线Modbus TCP监控S7-1200/200SMT PLC实例详解

工业自动化系统中&#xff0c;车间内通常部署多台PLC设备并需通过中央监控平台实现集中管控。考虑到工业现场设备间距普遍在数十至数百米范围&#xff0c;传统有线以太网虽能保障传输速率&#xff0c;但其施工需面临电缆沟开挖或复杂布线工程&#xff0c;既增加线材采购、人力投…

【AI智能编程】Trae-IDE工具学习

什么是Trae&#xff1f; Trae与 AI 深度集成&#xff0c;提供智能问答、代码自动补全以及基于 Agent 的 AI 自动编程能力。使用 Trae 开发项目时&#xff0c;你可以与 AI 灵活协作&#xff0c;提升开发效率。提供传统的 IDE 功能&#xff0c;包括代码编写、项目管理、插件管理…

智能驾驶再提速!批量苏州金龙L4级自动驾驶巴士交付杭州临平区

近日&#xff0c;由苏州金龙海格客车研发的“清源”L4级自动驾驶巴士现身杭州市临平区并投入测试。这是临平区引进的首批L4级自动驾驶巴士&#xff0c;标志着临平区智能交通建设迈入新阶段。此次投入测试的“清源”小巴采用一级踏步设计&#xff0c;车身延续了海格蔚蓝巴士的经…

Spring_事务

在mysql阶段的文章中&#xff0c;已经介绍过事务了。本篇文章是对mysql事务的总结和对使用Spring框架来实现事务操作的讲解。事务回顾什么是事务事务时一组操作的集合&#xff0c;是一个不可分割的操作。事务会把所有操作作为一个整体&#xff0c;一起向数据库提交或者撤销操作…

事务管理介绍

为什么要用事务管理在我们同时操作两个或更多个数据库时&#xff0c;可能因为网络等各方面原因导致中间出现异常。造成像对第一个数据库的操作成功了&#xff0c;但是对第二个数据库的操作没有成功。这样数据的完整性就被破坏了。事务&#xff1a;是一组操作的集合&#xff0c;…

Android 之 ViewBinding 实现更安全、高效的视图绑定

​​一、配置说明​​​​作用位置​​需在模块级 build.gradle或 build.gradle.kts文件的 android {}块内添加&#xff1a;android {buildFeatures {viewBinding true // Kotlin DSL 语法} }android {buildFeatures {viewBinding true // Groovy 语法} }​​生成规则​​为每…

全球首款Java专用AI开发助手实测:一句话生成完整工程代码——飞算 JavaAI

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f;&#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d;&#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680;&#x1f340;欢迎使用&#xff1a;小智初学计算机…

Shader开发(七)创建第一个Shader项目

在前面的章节中&#xff0c;我们已经了解了Shader的基本概念和渲染管线的工作原理。现在&#xff0c;是时候动手实践了&#xff01;本章将带您一步步创建第一个Shader项目&#xff0c;开启真正的Shader开发之旅。 为什么选择openFrameworks&#xff1f; 与其他文章不同&#x…

IAR软件中测量函数执行时间

通常在调试代码中需要直到某个函数或者某段代码的实际执行时间&#xff0c;在IAR中可以直接借助软件提供的工具来计算代码执行时间。 第一种方法 进入仿真调试界面&#xff0c;在需要测量的代码前面打断点。工具栏中选择 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字节码文件(.class)的组成详解

文章目录基础信息常量池字段方法属性字节码文件内容说明案例文件基本信息类的基本信息常量池字段信息构造方法实例方法主方法源文件信息字节码文件由五部分组成&#xff0c;分别是基础信息、常量池、字段、方法、属性。案例&#xff1a; public class Main implements Interfa…

C++之vector类的代码及其逻辑详解 (下)

1. insert()这个就是在指定位置插入一个元素&#xff0c;首先计算要插入的这个位置和开头之间的距离&#xff0c;接着判断那个_finish 有没有碰到_endofstorage 或者_endofstorage 是不是为0&#xff0c;如果满足条件&#xff0c;那就进行扩容&#xff0c;然后接着重新计算距离…

【自动化测试】Python Selenium 自动化测试元素定位专业教程

1. 引言&#xff1a;元素定位在 Selenium 中的核心地位 元素定位是 Selenium 自动化测试的基础&#xff0c;所有用户交互操作&#xff08;如点击、输入、选择&#xff09;都依赖于准确识别页面元素。Selenium WebDriver 提供了多种定位策略&#xff0c;从简单的 ID 定位到复杂…

通用代码自用

多文件上传public int save(Role role, RequestParam("nfile") MultipartFile nfile, HttpServletRequest request) {System.out.println(nfile.getOriginalFilename());String path request.getSession().getServletContext().getRealPath("/upload");Fi…

生成式AI如何颠覆我们的工作和生活

原问题&#xff1a; ​你觉得生成式AI未来会如何改变普通人的工作和生活&#xff1f;​ 做过一个对比国外和国内工业化产品制造的简单调研&#xff0c;类似一款定制化的台灯或者语音音响&#xff0c;从零到原型实物&#xff0c; 美国至少需要20万美刀&#xff0c;国内成本大概…

K8S、Docker安全漏洞靶场

1 介绍 一个脆弱基础设施自动化构建框架,主要用于快速、自动化搭建从简单到复杂的脆弱云原生靶机环境。 1.1 项目的缘起 在研究漏洞时,我们经常会发现“环境搭建”这一步骤本身就会占用大量的时间,与之相比,真正测试PoC、ExP的时间可能非常短。由于许多官方镜像在国内的…

使用Nginx部署前后端分离项目

使用Nginx部署前后端分离项目&#xff1a;用户中心系统实践指南 部署前的关键准备 在正式部署前&#xff0c;务必确保前后端在生产环境能正常运行&#xff1a; 前端&#xff1a;测试所有API请求路径和生产环境配置后端&#xff1a;验证数据库连接、环境变量和外部服务集成完整流…

当前就业形势下,软件测试工程师职业发展与自我提升的必要性

软件测试行业正处于深刻变革期&#xff0c;2025年的市场已超越400亿美元规模&#xff0c;预计2027年将增长7% 。在这个技术驱动、效率至上的时代&#xff0c;测试工程师若想保持竞争力&#xff0c;必须主动拥抱变革&#xff0c;系统性提升技能。通过深入分析行业现状与人才需求…

java 之 继承

一、继承 1.1 、什么是继承&#xff1f; 继承就是把所有的类的公共部分&#xff08;相同的成员&#xff09;提取出来&#xff0c;放到一个类中继承需要使用 extends 关键字 public class Animal{ public String name&#xff1b; } public class Dog extends Animal{}Dog 是 An…

强化应急通信生命线:遨游三防平板、卫星电话破局极端灾害救援

暴雨倾盆&#xff0c;山洪咆哮&#xff0c;城市陷入内涝。今年进入汛期以来&#xff0c;我国广东、福建、河南、陕西、京津冀等地相继遭遇暴雨、洪涝、山洪等灾害&#xff0c;道路损毁、基站断网、电力中断等次生问题为应急响应带来严峻挑战。如何保障极端场景下的通信畅通&…

【Linux系统】进程间通信:命名管道

1. 匿名管道的限制匿名管道存在以下核心限制&#xff1a;仅限亲缘关系进程&#xff1a;只能用于父子进程等有血缘关系的进程间通信&#xff08;如通过 fork() 创建的子进程&#xff09;。单向通信&#xff1a;数据只能单向流动&#xff08;一端写&#xff0c;另一端读&#xff…