VisualStudio开源库集成器Vcpkg全教程
利⽤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的官⽅源码站点为:
⼀般地,你可以使⽤git命令克隆⼀个当前版本下来,或者直接下载压缩包。
Vcpkg⼤量使⽤的psl脚本,所以官⽅强烈推荐使⽤PowerShell⽽不时CMD命令⾏来执⾏各种操作。尽管在使⽤的时候兼容CMD,但是在编译这⼀步,请使⽤PowerShell。
编译很简单,使⽤PowerShell执⾏Vcpkg⼯程⽬录下的“bootstrap-vcpkg.bat”命令,即可编译。编译好以后会在同级⽬录下⽣成⽂件。编译期间,脚本会⾃动下载vswhere组件。cmake如何使用
3. 使⽤Vcpkg
3.1. 查看Vcpkg⽀持的开源库列表
执⾏命令
.\ search
3.2. 安装⼀个开源库
这⾥的“安装”其实是指下载和编译。
⽐如我们需要安装常⽤的jsoncpp库,那么执⾏命令
.\ install jsoncpp
输出:
Total elapsed time: 47.81 s
The package jsoncpp:x86-windows provides CMake targets:
find_package(jsoncpp REQUIRED)
target_link_libraries(main PRIVATE jsoncpp_lib)
我们⼤致可以了解到install会经历这⼏个过程:
环境初始化
下载源代码(如果已经在cache中,则不下载)
校验⽂件有效性
解压缩源代码
利⽤配套⼯具配置源码⼯程,在这⾥是使⽤的是cmake(如果是ffmpeg,则⽤msys2)
编译源码。⼀般会同时编译Release和Debug版本。
把编译好的⽂件拷贝到相关⽬录中去(⼀般是installed⽬录)
注意点:
如果电脑中没有安装cmake,vcpkg会⾃动下载portable版本的cmake。但是由于各种原因,下载的⽹速很慢,所以建议先⾃⾏下载安装msi版本的cmake。最好是下载最新版本的cmake。
3.3. 指定编译某种架构的程序库
如果不指定安装的架构,vcpkg默认把开源库编译成x86的Windows版本的库。那vcpkg总共⽀持多少种架构呢?我们可以使⽤如下命令便知:
.\ 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,那么执⾏如下命令即可。
.\ install jsoncpp:x64-windows
3.4. 移除⼀个已经安装(编译)的开源库
如果移除⼀个已经安装的开源库,那么执⾏remove指令即可。⽐如我们要移除jsoncpp,那么执⾏命令:
.\ remove jsoncpp
注意:
这个时候只是移除了默认的x86-winodws版本的⽂件,如果有其他平台的版本需要移除,需要制定相应的triplet。
移除也只是移除了⼆进制程序库⽽已,源码包和解压缩的源码并没有删除。
如果想要⼀键移除“过时”的包,执⾏命令:
.\ remove --outdated
3.5. 列出已经安装的开源库
执⾏list指令即可,例如:
.\ list
3.6. 更新已经安装的开源库
⼀般有两种更新⽅式。⼀个是update指令,可以显⽰可以升级的开源库的列表。另⼀个是upgrade的指令,会重新编译所有需要更新的包。
3.7. 导出已经安装的开源库
有的时候,⼀个项⽬组中有很多⼈,不需要每个⼈都参与编译。⼀个⼈编译好所有开源库后到处给别⼈即可。有的时候也是出于备份的⽬的,也会导出已经安装的开源库。导出可以执⾏export指令。例如,我要导出jsoncpp库,那么执⾏:
.\ export jsoncpp --7zip
注意,导出时必须指定导出的包格式。vcpkg⽀持5种导出包格式,有:
参数    格式
–raw    以不打包的⽬录格式导出
–nuget    以nuget包形式导出
–ifw    我也不知道这是啥格式
–zip    以zip压缩包形式导出
–7zip    以7z压缩包形式导出
⼀般地,导出包的格式为:vcpkg-export-<⽇期>-<;时间>
默认情况下只会导出x86-windows的包,如果要导出所有包,那需要制定相应的triplet。⽐如,如果同时导出x86和x64版本的jsoncpp,那执⾏命令:
.\ export jsoncpp jsoncpp:x64-windows --7zip
这个命令等价于:
.\ export jsoncpp:x86-windows jsoncpp:x64-windows --7zip
如果要指定输出⽬录和特定⽂件名,需使⽤”–output=”参数
3.8. 导⼊备份的开源库
导⼊⽐较简单,执⾏import指令即可。例如:
.\ 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
这时候会在“\scripts\buildsystems”⽬录下,⽣成nuget配置⽂件.
其中是指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=/scripts/ake”
其中是指vcpkg实际所在⽬录。
4.6. 集成静态库
Vcpkg默认编译链接的是动态库,如果要链接静态库,⽬前还没有简便的⽅法。需要做如下操作
⽤⽂本⽅式打开vcxproj⼯程⽂件
在xml的段⾥⾯增加如下两句话即可
<VcpkgTriplet>x86-windows-static</VcpkgTriplet>
<VcpkgEnabled>true</VcpkgEnabled>
在CMake中集成静态库,需要额外指令

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。