Visual Studio开源库集成器Vcpkg全教程--利用Vcpkg轻松集成开源第三方库

article/2025/10/5 3:57:38

利用Vcpkg轻松集成开源第三方库

  • 1. 为什么要用Vcpkg
    • 1.1. 传统使用开源库的方法
      • 1.1.1. 编译工具
      • 1.1.2. 编译类型
      • 1.1.3. 工程目录设定
    • 1.2. Vcpkg的优点
  • 2. 获取Vcpkg
    • 2.1. 下载Vcpkg
    • 2.2. 编译Vcpkg
  • 3. 使用Vcpkg
    • 3.1. 查看Vcpkg支持的开源库列表
    • 3.2. 安装一个开源库
    • 3.3. 指定编译某种架构的程序库
    • 3.4. 移除一个已经安装(编译)的开源库
    • 3.5. 列出已经安装的开源库
    • 3.6. 更新已经安装的开源库
    • 3.7. 导出已经安装的开源库
    • 3.8. 导入备份的开源库
  • 4. Vcpkg和Visual Studio的集成
    • 4.1. 什么是集成?
    • 4.2. 集成到全局
    • 4.3. 移除全局集成
    • 4.4. 集成到工程
      • 4.4.1. 生成配置
      • 4.4.2. 基本配置
      • 4.4.3. 工程配置
    • 4.5. 集成到CMake
    • 4.6. 集成静态库
  • 5. 使用Vcpkg时的注意点
  • 6. 小结

1. 为什么要用Vcpkg

1.1. 传统使用开源库的方法

Windows下开发C/C++程序,少不了编译开源的第三方库。比如用于网络连接的高性能库libcurl、用于压缩解压的zlib等等。使用这些库开发极大的方便了程序员,使得我们不必重复造轮子。但是使用这些库必须要处理以下问题。

1.1.1. 编译工具

由于这些开源库绝大部分都来源于Linux系统,导致其工程文件、编译系统都使用gnu系列工具,使得将其移植到Windows的VC开发环境下一直是难点。尽管最近几年很多开源库都支持了跨平台的cmake,但是编译过程仍然复杂和多样化。

常见的编译方式有:

编译方式特点举例
configure、make需要msys这样的unix环境才可以编译ffmpeg
自定义编译工具需要学习特定的编译命令和工具openssl、boost
cmake相对简单轻松libcurl
VC工程文件这种最简单,直接拿来即可编译

1.1.2. 编译类型

当了解了这些还不够,我们还需要考虑预先编译出哪种类型的开源库程序。比如:Debug还是Release、动态库还是静态库、MD还是MT、32位还是64位。光是这三种组合就有16种可能性。如果像libcurl这种还要考虑是否引用其他开源库的功能,那么编译类型的组合会更多。管理起来很麻烦。

1.1.3. 工程目录设定

由于多样的编译类型,工程目录也必须仔细设定才能保证自己的软件项目能够正常编译。

1.2. Vcpkg的优点

  • 自动下载开源库源代码
  • 源码包的缓存管理和版本管理,可以升级版本
  • 轻松编译
  • 依赖关系检查(比如编译libcurl,会自动下载zlib、openssl进行编译)
  • 无缝集成Visual Studio,不需要设置库文件、头文件的所在目录,自动集成。
  • Visual Studio全平台支持,不仅支持Debug/Release、x86/x64编译,还支持UWP、ARM平台的编译。

2. 获取Vcpkg

2.1. 下载Vcpkg

Vcpkg的官方源码站点为:

https://github.com/microsoft/vcpkg

一般地,你可以使用git命令克隆一个当前版本下来,或者直接下载压缩包。

git clone https://github.com/microsoft/vcpkg

2.2. 编译Vcpkg

注意:

Vcpkg大量使用的psl脚本,所以官方强烈推荐使用PowerShell而不时CMD命令行来执行各种操作。尽管在使用的时候兼容CMD,但是在编译这一步,请使用PowerShell。

编译很简单,使用PowerShell执行Vcpkg工程目录下的“bootstrap-vcpkg.bat”命令,即可编译。编译好以后会在同级目录下生成vcpkg.exe文件。编译期间,脚本会自动下载vswhere组件。

3. 使用Vcpkg

3.1. 查看Vcpkg支持的开源库列表

执行命令

.\vcpkg.exe search

3.2. 安装一个开源库

这里的“安装”其实是指下载和编译。

比如我们需要安装常用的jsoncpp库,那么执行命令

.\vcpkg.exe install jsoncpp

输出:

The following packages will be built and installed:jsoncpp[core]:x86-windows
Starting package 1/1: jsoncpp:x86-windows
Building package jsoncpp[core]:x86-windows...
-- CURRENT_INSTALLED_DIR=H:/Repos/vcpkg/installed/x86-windows
-- DOWNLOADS=H:/Repos/vcpkg/downloads
-- CURRENT_PACKAGES_DIR=H:/Repos/vcpkg/packages/jsoncpp_x86-windows
-- CURRENT_BUILDTREES_DIR=H:/Repos/vcpkg/buildtrees/jsoncpp
-- CURRENT_PORT_DIR=H:/Repos/vcpkg/ports/jsoncpp/.
-- Downloading https://github.com/open-source-parsers/jsoncpp/archive/1.8.1.tar.gz...
-- Downloading https://github.com/open-source-parsers/jsoncpp/archive/1.8.1.tar.gz... OK
-- Testing integrity of downloaded file...
-- Testing integrity of downloaded file... OK
-- Extracting source H:/Repos/vcpkg/downloads/open-source-parsers-jsoncpp-1.8.1.tar.gz
-- Extracting done
-- Configuring x86-windows-rel
-- Configuring x86-windows-rel done
-- Configuring x86-windows-dbg
-- Configuring x86-windows-dbg done
-- Build x86-windows-rel
-- Build x86-windows-rel done
-- Build x86-windows-dbg
-- Build x86-windows-dbg done
-- Performing post-build validation
-- Performing post-build validation done
Building package jsoncpp[core]:x86-windows... done
Installing package jsoncpp[core]:x86-windows...
Installing package jsoncpp[core]:x86-windows... done
Elapsed time for package jsoncpp:x86-windows: 47.81 sTotal elapsed time: 47.81 sThe package jsoncpp:x86-windows provides CMake targets:find_package(jsoncpp REQUIRED)target_link_libraries(main PRIVATE jsoncpp_lib)

我们大致可以了解到install会经历这几个过程:

  1. 环境初始化
  2. 下载源代码(如果已经在cache中,则不下载)
  3. 校验文件有效性
  4. 解压缩源代码
  5. 利用配套工具配置源码工程,在这里是使用的是cmake(如果是ffmpeg,则用msys2)
  6. 编译源码。一般会同时编译Release和Debug版本。
  7. 把编译好的文件拷贝到相关目录中去(一般是installed目录)

注意点:

如果电脑中没有安装cmake,vcpkg会自动下载portable版本的cmake。但是由于各种原因,下载的网速很慢,所以建议先自行下载安装msi版本的cmake。最好是下载最新版本的cmake。

3.3. 指定编译某种架构的程序库

如果不指定安装的架构,vcpkg默认把开源库编译成x86的Windows版本的库。那vcpkg总共支持多少种架构呢?我们可以使用如下命令便知:

.\vcpkg.exe help triplet

我们可以看到会列出如下清单:

  • arm-uwp
  • arm-windows
  • arm64-uwp
  • arm64-windows
  • x64-uwp
  • x64-windows-static
  • x64-windows
  • x86-uwp
  • x86-windows-static
  • x86-windows

这个清单以后随着版本的迭代还会再增加。vcpkg不仅支持x86架构,还支持arm架构。注意:这里的arm架构特指类似于surface这种运行在arm处理器上的Win10平台,而并非我们传统意义上的Linux或android的ARM平台。

那如果要安装编译某一个架构的开源库,我们该怎么写呢?我们只需要在需要安装的包后面指定相应的triplet即可。例如我们需要编译64位版本的jsoncpp,那么执行如下命令即可。

.\vcpkg.exe install jsoncpp:x64-windows

3.4. 移除一个已经安装(编译)的开源库

如果移除一个已经安装的开源库,那么执行remove指令即可。比如我们要移除jsoncpp,那么执行命令:

.\vcpkg.exe remove jsoncpp

注意:

  • 这个时候只是移除了默认的x86-winodws版本的文件,如果有其他平台的版本需要移除,需要制定相应的triplet。
  • 移除也只是移除了二进制程序库而已,源码包和解压缩的源码并没有删除。

如果想要一键移除“过时”的包,执行命令:

.\vcpkg.exe remove --outdated

3.5. 列出已经安装的开源库

执行list指令即可,例如:

.\vcpkg.exe list

3.6. 更新已经安装的开源库

一般有两种更新方式。一个是update指令,可以显示可以升级的开源库的列表。另一个是upgrade的指令,会重新编译所有需要更新的包。

3.7. 导出已经安装的开源库

有的时候,一个项目组中有很多人,不需要每个人都参与编译。一个人编译好所有开源库后到处给别人即可。有的时候也是出于备份的目的,也会导出已经安装的开源库。导出可以执行export指令。例如,我要导出jsoncpp库,那么执行:

.\vcpkg.exe export jsoncpp --7zip

注意,导出时必须指定导出的包格式。vcpkg支持5种导出包格式,有:

参数格式
–raw以不打包的目录格式导出
–nuget以nuget包形式导出
–ifw我也不知道这是啥格式
–zip以zip压缩包形式导出
–7zip以7z压缩包形式导出

一般地,导出包的格式为:vcpkg-export-<日期>-<时间>

默认情况下只会导出x86-windows的包,如果要导出所有包,那需要制定相应的triplet。比如,如果同时导出x86和x64版本的jsoncpp,那执行命令:

.\vcpkg.exe export jsoncpp jsoncpp:x64-windows --7zip

这个命令等价于:

.\vcpkg.exe export jsoncpp:x86-windows jsoncpp:x64-windows --7zip

如果要指定输出目录和特定文件名,需使用"–output="参数

3.8. 导入备份的开源库

导入比较简单,执行import指令即可。例如:

.\vcpkg.exe import xxx.7z

4. Vcpkg和Visual Studio的集成

4.1. 什么是集成?

上面我们已经安装了一些第三方库,那如何使用呢?常规情况下,我们需要设置include目录、lib目录等,会有很多工作量。Vcpkg提供了一套机制,可以全自动的适配目录,而开发者不需要关心已安装的库的目录在哪里,也不需要设置。这是Vcpkg的一大优势。

4.2. 集成到全局

“集成到全局”适用于Visual Studio开发环境和msbuild命令行。执行命令:

 .\vcpkg integrate install

当出现“Applied user-wide integration for this vcpkg root.”字样的时候,说明已经集成成功。这时候可以在任意的工程中使用安装好的第三方库。

4.3. 移除全局集成

移除全局集成只要执行下列命令即可:

 .\vcpkg integrate remove

4.4. 集成到工程

上面已经可以集成到全局,为什么还要“集成到工程”呢?因为在大部分情况下,我们不希望集成到全局,毕竟有很多第三方库我们希望自定义处理一下,或者干脆不想集成第三方库。那么集成到工程是最灵活的处理方式。也是工程级项目推荐的处理方式。

“集成到工程”是整个vcpkg中最复杂的一项,它需要利用Visual Studio 中的nuget插件来实现。我们接下来一步一步来说。

4.4.1. 生成配置

执行命令

 .\vcpkg integrate project

这时候会在“<vcpkg_dir>\scripts\buildsystems”目录下,生成nuget配置文件.

其中<vcpkg_dir>是指vcpkg实际所在目录。

4.4.2. 基本配置

打开Visual Studio,点击菜单“工具->NuGet包管理器->程序包管理器设置”,进入设置界面,点击“程序包源”。


点击“加号”增加一个源。修改源的名字为vcpkg。在“源”的选项中点击右侧的"…"选择vcpkg目录下的“scripts\buildsystems”目录,然后点击右侧的“更新按钮”。

点击“确定”,关闭设置对话框。

到此,全局性的设置已经完成,以后不必再重复设置了。

4.4.3. 工程配置

用Visual Studio 打开一个工程或解决方案。右键点击需要设置的工程,选择“管理NuGet程序包”。在右上角的“程序包源”中选择刚刚设置的“vcpkg”。这样在“浏览”选项卡中就可以看到“vcpkg.H.Repos.vcpkg”。点击最右侧的“安装”。这样就可以集成到某个工程了。

4.5. 集成到CMake

最新的Visual Studio 2015和2017大力支持CMake工程,所以对cmake的支持当然不能少。在cmake中集成只要在cmake文件中加入下面这句话即可。

-DCMAKE_TOOLCHAIN_FILE=<vcpkg_dir>/scripts/buildsystems/vcpkg.cmake"

其中<vcpkg_dir>是指vcpkg实际所在目录。

4.6. 集成静态库

Vcpkg默认编译链接的是动态库,如果要链接静态库,目前还没有简便的方法。需要做如下操作

  1. 用文本方式打开vcxproj工程文件
  2. 在xml的段里面增加如下两句话即可
<VcpkgTriplet>x86-windows-static</VcpkgTriplet>
<VcpkgEnabled>true</VcpkgEnabled>

在CMake中集成静态库,需要额外指令

cmake .. -DCMAKE_TOOLCHAIN_FILE=.../vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x86-windows-static

5. 使用Vcpkg时的注意点

  • Vcpkg仅支持Visual Studio 2015 update 3及以上版本(包括Visual Studio 2017),究其原因,很可能和c++11的支持度以及集成原理有关系。
  • 目前Vcpkg编译静态库,默认只支持MT模式。

6. 小结

Vcpkg目前还在不断的完善中,但不可否认,它已经极大的减少了我们在项目启动时,准备第三方库的时间。提高了工作效率。按照时髦的话来说,就是避免了重复造轮子。目前Vcpkg已经集成了上百个常用的开源库,而且数量还在不停增长。毕竟是微软旗下的开源项目,质量还是可以得到保障的,完全可以在工业级项目中得以使用。源代码托管在github上,github社区很活跃,有兴趣的朋友也可以参与进来。

作者简介:陈建明,目前就职于agora声网。


http://chatgpt.dhexx.cn/article/aGPKLx31.shtml

相关文章

VCPKG安装和使用教程

文章目录 1. 安装2. 使用命令选项 3. 集成vcpkgWindows 上的 Visual Studio 集成Linux 或 macOS 上的 Visual Studio Code 集成删除 vcpkg 集成 使用举例4. 详细介绍4.1 新增库4.2 删除库4.3 查看已经安装的列表4.4 更新已经安装的开源库 1. 安装 去GitHub上下载源码&#xff…

vcpkg快速入门手册

文章目录 1. 简介2. 安装与使用2.1 获取vcpkg2.2 编译vcpkg2.3 vcpkg的文件夹层次结构2.4 设置vcpkg的环境变量2.5 vcpkg的常用命令2.6 安装包与Visual Studio集成 3. 常见的C库的CMake配置方式3.1 Boost3.2 cereal3.3 Ceres Solver3.4 CGAL3.5 FLANN3.6 GDAL3.7 GLEW3.8 GMP3.…

vcpkg安装和使用--学习入门

前言 vcpkg是一个C的包管理器。 包管理器是专门管理一些代码库的。比如一些大佬们开源的一些NB的框架&#xff0c;我们可以用vcpkg将他们放到自己的项目中。然后就可以直接用了。 我用的win10vs2019 【1】安装 &#xff08;1&#xff09;先git clone下载下来vcpkg文件夹。 …

Vcpkg 的安装与使用

Vcpkg 的安装与使用 欢迎大家来我的博客逛逛&#x1f44f;&#xff1a;hauhau.cn 需求 先确保你已经安装了: Windows7 及以上的版本GitVisual Studio 2015 Update 3 及以上的版本 关于美化 Windows Terminal 及 Powershell&#xff0c;可以查看这篇优秀文章: Windows-Termi…

C++第三方库管理工具vcpkg使用教程

目录 一、vcpkg介绍二、vcpkg安装1、安装vs英语语言包2、更新PowerShell版本3、配置终端4、clone vcpkg 三、vcpkg具体使用1、演示安装jsoncpp库2、指定位数安装3、查找支持的系统架构4、查看已经安装了哪些库5、如何卸载vcpkg 四、如何集成到visual studio1、集成到Visual Stu…

NS版暗黑破坏神3金手指开发教程(12)

上一节&#xff0c;我们了解到了宝石升级动画延时机制的修改&#xff0c;这一节&#xff0c;我们将全方位地介绍游戏中多个常用功能的延时机制修改&#xff0c;优化玩家的游戏体验&#xff0c;相信经过本节&#xff0c;读者的程序分析能力会有进一步提高 1. 我们首先从鉴定传奇…

NS版暗黑破坏神3金手指开发教程(2)

上一节&#xff0c;介绍了开发金手指所需的工具&#xff0c;这一节&#xff0c;正式开始简单的金手指修改 1. 首先&#xff0c;分别要准备好2.6.6的main.elf和原始版本待调试信息的DiabloIIINX64ra.elf&#xff0c;因为我们要修改的是2.6.6版本的elf&#xff0c;和最初带调试信…

NS版暗黑破坏神3金手指开发教程(7)

上一节&#xff0c;我们讲解了通过代码Hack的方式修改人物的魔法物品获取率和金币获取量等属性&#xff0c;这一节&#xff0c;我们将一鼓作气&#xff0c;拿下移速攻速等更复杂的属性修改 1. 我们在原始版本里搜索移速英文movespeed得到一个结果&#xff0c;双击打开伪代码 2…

Unity 基础常用的脚本(一)

1.获取相机射线 var ray Camera.main.ScreenPointToRay(Input.mousePosition); //GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position ray.GetPoint(10.0f); transform.LookAt(ray.GetPoint(10.0f)); 2.AddForce和velocity有什么区别&#xff1f; AddForc…

NS版暗黑破坏神3金手指开发教程(10)

上一节&#xff0c;我们讲解了一击必杀&#xff0c;技能冷却无CD等人物战斗时用到的金手指制作&#xff0c;这一节&#xff0c;将会讲解人物升级相关的功能以及宝石和打孔器等材料数量的锁定功能制作 1. 在游戏中特别是在游戏后期&#xff0c;我们会发现人物随着等级的提高&am…

Unity脚本复习

1.在Project面板中显示和创建的每一个脚本其实都是一个类&#xff0c;当我们把脚本挂载到Hierarchy层级中的游戏物体时&#xff0c;其实我们就实现了将脚本类实例化为一个脚本组件&#xff08;对象&#xff09;的过程 2.在游戏运行时&#xff0c;场景加载&#xff0c;游戏对象…

零基础游戏开发笔记11——Unity脚本介绍、脚本初始阶段

1.语法结构&#xff1a; 2.编译过程&#xff1a; CLS->Mono RunTime->机器码 3.关于修改和创建脚本&#xff1a; 创建脚本&#xff1a; 一般我们会在项目中添加scripts文件夹&#xff0c;并在此文件夹中编写脚本&#xff0c;当然这些脚本可以根据个人喜好分配到不同类…

NS版暗黑破坏神3金手指开发教程(4)

上一节&#xff0c;我们讲了基于公式明文的金手指制作方法&#xff0c;这一节&#xff0c;我们将进阶到更高级的基于程序修改的金手指制作方法&#xff0c;从现在开始&#xff0c;对读者的技术水平有了一个更高的要求&#xff0c;读者最好有汇编和C/C高级语言的一些基础&#x…

NS版暗黑破坏神3金手指开发教程(17)

终于到最后一节了&#xff0c;在这一节中我们将讲解如何利用hack制作出丰富多彩的世界&#xff0c;开个玩笑&#xff0c;其实是因为由于暗黑三的AMIIBO功能很有意思&#xff0c;不但可以用普通手办在城外召唤出一组精英怪&#xff0c;而且在城内用专用哥布林手办还能开启宝藏秘…

NS版暗黑破坏神3金手指开发教程(5)

上一节&#xff0c;我们学会了通过修改程序指令的方式制作金手指&#xff0c;这一节&#xff0c;将引出真正的高手级金手指开发方法 除了必掉太古这个极其护肝和有用的金手指外&#xff0c;我们能想到的另一个金手指就是人物背包里的素材&#xff0c;包括金钱&#xff0c;宝石…

暗黑破坏神2 符文自动合成--按键精灵源码

最近玩了一个暗黑破坏神mod服 发现2个符文可以合成一个大号符文.不过手动合成实在太费劲了.于是乎我就写了一个自动合成的脚本. 需要用到图灵插件,不知道的自己百度一下. 还是挺有意思的这类脚本.还需要有一个自己的算法. 源码如下. Function 移动鼠标点左键(x1, y1)MoveT…

Unity脚本(二)

视频教程&#xff1a;https://www.bilibili.com/video/BV12s411g7gU?p122 目录 Transform GameObject Object GetComponentInParent LookAt GetSiblingIndex、SetSiblingIndex Instantiate Transform 对象的位置、旋转和缩放 场景中的每个对象都有一个Transform&…

Unity 剧情类游戏基础脚本

本文主要用于给新人提供实现剧情类游戏的基本思路。 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; 然后是一个很重要的 [System.Serializable] 它的作用是使得在检查器窗口来看到我i们自己创建的类从而实现在检…

Unity脚本(三)

视频教程&#xff1a;https://www.bilibili.com/video/BV12s411g7gU?p128 目录 Time Prefab Animation Time Time.time&#xff1a;自应用程序启动以来&#xff0c;每帧的开始时间&#xff08;只读&#xff09; Time.deltaTime&#xff1a;每帧间隔&#xff0c;或说完…

NS版暗黑破坏神3金手指开发教程(1)

最近重温了NS版的暗黑三&#xff0c;因为空闲时间实在有限&#xff0c;面对这样一款刷刷刷的经典作品&#xff0c;为了护肝以及更爽快的游玩&#xff0c;同时为了弥补自己丢失已久的汇编技能&#xff0c;加上NS版暗黑三最初版本里有带完整调试信息的elf文件&#xff0c;于是有了…