新玩意:使用vcpkg来管理你的C++代码库

新玩意:使用vcpkg来管理你的C++代码库

作者:HQ |  时间:2019-08-03 |  浏览:515 |  评论已关闭 条评论

vcpkg的2019.06更新
vcpkg是一个集成在宇宙级开发IDE(Visual Studio)中的一个组件,其主要用于代码库的管理及索引。在2019.06这次更新中,vcpkg现在可以用来在多个不同的平台上来管理C/C++代码库。开发团队为此还专门在github上专门创建了一个仓库:microsoft/vcpkg.

代码库别名:Ports
开发团队使用Ports这个名词来表示各种可用的第三方代码库。在今年6月的更新中又新增44个新的代码库,这些加入进来的新伙计们包括:bdwgc, cJSON, greatest, immer, json-c以及zydis. 值得注意的是,开发团队选择代码库的其中一个原则是:这个代码库的star数是否足够?上面列出来的几个,star数基本都在1K以上。
截至目前,vcpkg的github仓中已经集成291个代码库。

代码库主页
为了能让开发者快速了解一个代码库,开发团队将各个代码库的主页也加入进来。例如,有一个代码库Abseil,只需要导航至:/ports/abseil/CONTROL,我们就可以看到一行主页的链接信息,这样就能方便的前往代码库主页了解这个库。

Overlay Ports
在vcpkg工具中,我们可以使用search/install等指令来管理代码库。另外,开发团队还添加了一个所谓的:Overlay ports的特性。我们可以使用这个特性来制定不同版本的代码库,甚至用来创建私有的Port。

举个栗子
在一个项目中,我想使用OpenCV视觉库,并且由于项目的一些依赖原因,我需要使用的是3.0的版本。但是不巧的是,这个版本稍稍有点旧了,vcpkg中包含的版本是3.4.3, 所以,这就比较尴尬了。

解决此问题的方法时,我们在GitHub上创建一个私有的仓库,然后将OpenCV3.0的代码Checkin到这个仓,然后将这个私有仓提交到vcpkg的ports目录,这样项目成员就可以使用3.0版本的OpenCV了。

我们来看看具体的流程:
初始化git仓库,并导入3.0版本OpenCV库

接下来,项目团队就可以使用vcpkg的overlay-ports参数来使用这个版本的代码库了。

当然,如果某一天,你又想使用最新版本的库了,可以使用bootstrap-vcpkg.bat来更新vcpkg。
开发团队目前在完善这个特性,所以你可能会碰到一些稀奇古怪的问题,这个时候,请到GitHub上的vcpkg的主页提交问题给开发团队。

Triplets
vcpkg默认提供多种目标平台,例如Windows, Linux和WSL(Windows Subsystem for Linux)。目前开发团队已经添加了Linux上可用的库多达755个。我们看看下面的统计表格:

可以看到Windows平台的ports最多,用于64位Windows的库有1000多个。其他几个平台也有几百个。如果你期望的目标平台不在这个列表中,你还可以创建目标平台,方法还挺简单,具体得看看文档了。微软的文档,我的感觉是又多又齐全,我这辈子应该是没有机会全部看完了。

Overlay Triplets
和上面提到的Overlay Ports类似的,本次更新还包含Overlay Triplets特性。我们可以使用这个特性来Override默认的目标平台,或者创建新的目标平台。

举个栗子
有些Linux用户,可能需要动态链接库,但是目前的x64-linux平台中提供的是静态的库。那么我们可以基于x64-linux平台来新建一个新的Triplet,这个新Triplet将创建动态库。

第一步,创建一个目录用于保存新的Triplet。

然后,拷贝一份x64-linux的triplet文件,并重命名一个新的triplet名字。

修改新配置文件中的相关参数

具体到这个例子来说,我们将VCPKG_LIBRARY_LINKAGE的值由static修改为:dynamic。
最后,我们可以使用–overlay-triplets来安装第三方库了,安装成功之后,就可以得到动态编译出来的库,而不是默认的静态库。

对代码库作者的支持
除了方便代码库的使用者,开发团队还考虑到了代码库的作者。新增的几个特性,可以帮助代码库作者提升开发效率和增强代码的品质。

CI持续集成
开发团队在Azure DevOps pipelines上添加了公共的测试代码,这些测试代码将测试搭建在GitHub上的vcpkg仓库。开发者可以直接获取编译失败日志及静态检查失败结果。例如:

可以通过图标来指示Check是否成功。如果Check失败,则还可以看到有关此次失败的详细信息:

在Azure DevOps的Summary页面,可以下载所有失败的日志及相关的变更描述。

Check Features
通过vcpkg_check_features这个新特性,我们可以在检查代码库的一个或者多个feature是否包含在库中。例如,如果想启用OpenCV的CUDA特性支持,可以使用如下指令:

vcpkg_check_features简化了代码库的可选特性的创建过程,在之前的实践中,可能需要编写如下的脚本:

现在,只需要编写如下脚本:

总结
vcpkg从一个VS中自带的C++代码管理组件,逐渐演化成今天的跨平台的代码管理组件,离不开开发团队的辛勤工作,我们也可以从这个变化中看出:微软的重心已经从Windows这条大船转移到企业应用,云服务及开源社区。这个变革在Ballmer时期是不可想象的,相信在Satya的领导下,微软能在新的领域再创一个辉煌。

标签:

评论已关闭。