【软件开发】vcpkg 学习笔记

"vcpkg"是一个免费开源的 C++包管理器,可以以此很方便的处理第三方库的接入,且可嵌入进 CMake 中。

入门

入门教程请参照:

https://learn.microsoft.com/zh-cn/vcpkg/get_started/get-started?pivots=shell-cmd

大概的接入流程是:

  1. 安装 vcpkg。
  2. 编写 CMakePresets,接入 vcpkg 的 CMake 工具链工具。(CMake 笔记中的 CMakePresets 示例)
  3. 使用vcpkg new --application创建清单文件,填写所需库。
  4. 在 CMakeLists 中使用find_package()获取 vcpkg 库。
  5. 使用带有 vcpkg 的 CMakePresets 生成项目,完成接入。

配置

查找包

若要查看 vcpkg 支持的所有包,有两种方式:

安装包

vcpkg 支持“经典模式”和“清单模式”两种方式安装包:

  • 经典模式,通过终端指令程序化处理。
  • 清单模式,通过编辑根目录的“vcpkg.json”文件处理。

推荐使用清单模式,因为这样使用更透明更清晰:

https://learn.microsoft.com/zh-cn/vcpkg/reference/vcpkg-json

文件内容示例如下:

{
"dependencies": [
"gtest",
{
"name": "imgui",
"features": ["dx12-binding", "win32-binding"]
}
]
}

锁定版本

要想锁定包版本必须先提供基线参数,基线参数是 vcpkg 仓库一次提交的 SHA(必须是本地 vcpkg 仓库中存在的版本),这样所有包版本将都被限制于必须大于等于该基线时的版本。

当提供基线后才可以使用overrides参数进行版本覆盖,以强制使用特定版本,示例如下:

{
"builtin-baseline": "333ba63a16024f05f9172fe403f9eced000389e5",
"overrides": [
{
"name": "imgui",
"version": "1.91.0"
}
]
}

引用包

关于每个包在 CMakeLists 中的使用,一般由以下两个命令构成:

find_package(<pkgCMakeName> CONFIG REQUIRED)
target_link_libraries(<projectName> PRIVATE <pkgCMakeProjectName>)

其中 projectName 是你自己需要用到该包的项目,而 pkgCMakeNamepkgCMakeProjectName 的内容则需要进行推断,具体有三种方法:

  1. CMake 构建时会自动启发式生成使用方法并打印在构建结果中。
  2. 通过官方的usage文件得出,这是官方编写的默认引入方法。
  3. 通过查看包安装目录的一个文件得出:

    例如要引入 gtest,通过查看 vcpkg_installed\x64-windows\share\GTestTargets.cmake 文件,其中文件名前缀GTestpkgCMakeName,文件内的 add_library(GTest::gtest) 则表明GTest::gtestpkgCMakeProjectName

示例引用方式如下:

# 改编自 gtest 的 usage 文件
find_package(GTest CONFIG REQUIRED)
target_link_libraries(Executable PRIVATE GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)
# 通过分析 imguiTargets.cmake 得出
find_package(imgui CONFIG REQUIRED)
target_link_libraries(Executable PRIVATE imgui::imgui)

【软件开发】vcpkg学习笔记的更多相关文章

  1. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

  2. 微信小程序开发:学习笔记[5]——JavaScript脚本

    微信小程序开发:学习笔记[5]——JavaScript脚本 快速开始 介绍 小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来 ...

  3. 微信小程序开发:学习笔记[4]——样式布局

    微信小程序开发:学习笔记[4]——样式布局 Flex布局 新的布局方式 在小程序开发中,我们需要考虑各种尺寸终端设备上的适配.在传统网页开发,我们用的是盒模型,通过display:inline | b ...

  4. 微信小程序开发:学习笔记[3]——WXSS样式

    微信小程序开发:学习笔记[3]——WXSS样式 快速开始 介绍 WXSS(WeiXin Style Sheets)是一套用于小程序的样式语言,用于描述WXML的组件样式,也就是视觉上的效果. WXSS ...

  5. 微信小程序开发:学习笔记[2]——WXML模板

    微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...

  6. 微信小程序开发:学习笔记[1]——Hello World

    微信小程序开发:学习笔记[1]——Hello World 快速开始 1.前往微信公众平台下载微信开发者工具. 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/ ...

  7. 微信小程序开发:学习笔记[9]——本地数据缓存

    微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...

  8. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]——页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  9. C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享

    原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...

  10. C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享

    原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享 曾经我做office,不想依赖别人dll,就使用了 Type.GetTypeFromProgID 可以根 ...

随机推荐

  1. vue使用docxtemplater导出word

    安装 // 安装 docxtemplater npm install docxtemplater pizzip --save // 安装 jszip-utils npm install jszip-u ...

  2. 【Amadeus原创】华为一键强制关闭后台应用的终极解决方法

    华为手机速度是快,用起来很顺手,但是最让人头疼的,就是紧急情况开会,我音乐关不了. 上划把全部应用删掉,也没用. 经过一阵子摸索,发现终极办法: 1, 打开华为自带的 手机助手- 应用启动管理 2, ...

  3. Shiro简单入门+个人理解(3)

    最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了 Shiro的授权: 授权:对用户资源访问的授权(是否允许用户访问此资源) 用户访问系统资源时的 ...

  4. System.Text.Json匿名对象反序列化

    以前就是一直使用 Newtonsoft.Json 用起来还是挺舒服的.由于 JSON 的应用越来越广,现在. NET Core 都内置了 System.Text.Json 可以直接对 JSON 进行操 ...

  5. 【Vue】vue项目搭建、ES6的简单使用(大觅)

    目录 项目搭建与基本配置 项目搭建 安装淘宝NPM镜像 cnpm 安装webpack 新建项目 运行项目 运行时出现的一些问题和解决方案 框架安装 安装UI框架iView 引入UI框架iView 引入 ...

  6. Navicat Premium15安装与激活

    Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库,让管理不 ...

  7. 关于在VMware中安装的CentOS7系统中无法安装ntp

    一.问题引言 今天在虚拟机中新安装了CentOS7,在使用yum命令时,出现如下如错误: 2.点击图片中链接,即是"2"中的红框,发现该链接竟不可达 3.于是开始找度娘,但并没有发 ...

  8. Qt/C++音视频开发55-加密保存到文件并解密播放

    一.前言 为了保证视频文件的安全性,有时候需要对保存的视频文件加密,然后播放的时候解密出来再播放,只有加密解密的秘钥一致时才能正常播放,用ffmpeg做视频文件的加密保存和解密播放比较简单,基于ffm ...

  9. [转]C# Winform 跨线程更新UI控件常用方法汇总

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  10. 网络编程入门从未如此简单(三):什么是IPv6?漫画式图文,一篇即懂!

    本文由小枣君分享,文案:小枣君.漫画:杨洋,来自鲜枣课堂,有少许改动,原文链接见文末. 1.引言 网络编程能力对于即时通讯技术开发者来说是基本功,而计算机网络又是网络编程的理论根基,因而深刻准确地理解 ...