vcpkg——微软开源的c/c++第三方库集成管理工具

简介:

    vcpkg是微软出品的一个开源第三方库集成管理工具,用于改善Windows中混乱不堪的集成环境。

    在*inx中,我们有各发行版集成的包管理软件,如apt、yum等,使用它们可便捷的安装/卸载/升级第三方库。但是在Windows中并没有一个统一的(大多数人使用)集成管理工具。现已知的有:

  1. Visual Studio自带的NuGet包管理器。
  2. scoop
  3. chocolate

    这些集成管理工具或多或少有些局限性,并不能满足拿来就能使用的所有场景。所以,微软发起了vcpkg项目,希望补足这个短板。

 

vcpkg能干什么?

    通常我们在日常开发工作中需要使用大量的第三方库(避免造轮子),例如:openssl,sqlite3,mysql,boost等等。我们需要将其源码下载下来,查阅官方编译文档进行编译,并集成进自己的项目中。并在CI中使用它们。通常的,过一段时间也需要更新这些库的源码,重新编译以解决库本身bug/使用库的新功能。

    嗯,都是工作量呐!甚至于大一点的公司中,由于许多项目使用了一些通用的第三方库,为了解决集成管理这些库的问题,需要专人负责并维持一个统一的版本。hmm...这不是跟vcpkg很像吗?甚至于一些框架(qt、tensorflow)也集成进vcpkg中。

    vcpkg作为一个通用的第三方库集成管理器,可以:

  1. 支持三大平台: Windows, *inx, macOS
  2. 集成了一千多个第三方库(随着时间增多,这个数字还更多)
  3. 通过源码生成库,防止库中包含恶意代码
  4. 支持动态及静态库构建
  5. 默认同时生成debug与release,可配置仅生成其中一个
  6. 支持MT与MD构建
  7. 支持arm、uwp构建
  8. 支持第三方库自带功能选择性编译
  9. 支持多种工具编译(msvc、ninja、qmake、nmake、gcc、darwin等)
  10. 支持多种编译脚本(cmake、makefile等)
  11. 支持c++20
  12. 支持升级功能,回溯版本功能
  13. 支持导出为nuget包、zip压缩文件等功能
  14. 支持查看依赖树
  15. 支持集成至本机环境,一键使用完全没问题(cmake/Visual Studio)

     等等...

 

怎么使用vcpkg?

1. 下载vcpkg源码

    vcpkg所有源码存储在github上,我们可以使用git下载它:

> git clone https://github.com/Microsoft/vcpkg.git
> cd vcpkg

或直接下载源码压缩包解压。

 

2. 编译

    编译vcpkg需要Visual Studio 2015 Update 3或更新的版本(Windows) / gcc(*inx) / darwin(macos),执行下列命令:

Windows> .\bootstrap-vcpkg.bat
Linux/MacOS:~/$ ./bootstrap-vcpkg.sh

    完成后,vcpkg就可以使用了。

 

3. 试着安装一个包:

Windows> .\vcpkg install sdl2 curl
*inx/MacOS:~/$ ./vcpkg install sdl2 curl

    安装完成后,我们可以在 VCPKG_PATH/installed/DEFAULT_TRIPLET/ 中看见生成的头文件、静态库、动态库、工具及说明等文件。

 

4.怎么使用生成的库?

    vcpkg支持集成至本机环境功能,但目前仅限于Visual Studio和cmake。使用以下命令来集成:

Windows> .\vcpkg integrate install
*inx/MacOS:~/$ ./vcpkg integrate install

    执行完成后,请重启Visual Studio(使用Visual Studio时)。现在,我们打开一个新工程,不需要添加任何路径至配置中就可以使用#include调用头文件,亦不需要添加第三方库名称至加载库列表中。并且在使用msvc工程时,生成自己的项目后还会自动复制使用到的动态库喔!

    当然,对于其他工具,请将以下路径加入对应路径中:

  • VCPKG_PATH/installed/DEFAULT_TRIPLET/include → INCLUDE_PATH
  • VCPKG_PATH/installed/DEFAULT_TRIPLET/lib → LIB_PATH 
  • VCPKG_PATH/installed/DEFAULT_TRIPLET/bin/* → 复制至工程生成路径下

 

5. 怎么导出?

    使用命令export导出已经安装的库:

Windows> .\vcpkg export sdl2:x64-windows-static sdl2:arm-uwp --zip
*inx/MacOS:~/$ ./vcpkg export sdl2:x64-linux-dynamic --zip

    完成后我们可以在vcpkg根目录下找到这些压缩包,并移动至其他环境使用。

 

6.我还能做什么?

    1. 我们可以通过使用指定的triplet来选择编译生成的库类型(静态/动态/arm/uwp等):

Windows> .\vcpkg install sdl2:x64-windows-static sdl2:arm-uwp
*inx/MacOS:~/$ ./vcpkg install sdl2:x64-linux-dynamic

    对于静态库在msvc工程中集成方式,请参考文档。

    2. 启用第三方库的某些功能:

Windows> .\vcpkg install curl[openssl]
*inx/MacOS:~/$ ./vcpkg install curl[openssl]

    3. vcpkg官方与贡献者会定期更新支持的库版本。我们需要定期使用 git pull更新vcpkg源码,并再次执行编译命令检查第三方库是否更新。

    vcpkg目前支持多个非编译的功能性命令,例如查看依赖列表、搜索包、导入、导出等。我们可以使用以下命令查看这些命令:

Windows> .\vcpkg help
*inx/MacOS:~/$ ./vcpkg help

 

好了,使用阶段到此为止,以下是简析阶段:

简析 

    vcpkg使用了cmake作为执行编译中间工具/语言,优势在于跨三个平台通用,无需写特定代码适配。并根据第三方库的repo地址,branch,ref,url及sha512来确保下载了正确的第三方库源码。它做到了工具与库分离,灵活的配置文件,可扩展性等等。

代码结构 

    当我们下载完成源码后,可看到基础代码结构为:

|——                       # root

| .github                  # github模板

| docs                     # 文档

| ports                    # 第三方库描述文件

| scripts                  # cmake通用代码,工具配置及其他脚本

| toolsrc                  # vcpkg代码

| triplets                  # 平台配置文件

| other file              # git相关配置文件,编译vcpkg脚本,readme,license等

 

    而在编译vcpkg及第三方库后,还会出现四个文件夹:

|——                      # root

| buildtrees             # 第三方库解压源码及生成的中间文件

| downloads           # 各工具压缩包、各工具二进制及第三方库源码压缩包

| installed               # 各平台下存档的第三方库头文件、二进制、工具、readme及license等

| packages             # 第三方库分triplet存档

 

执行流程

    vcpkg使用命令启动后,会经过命令处理、预处理环境、调用cmake执行内部cmake文件、调用cmake编译/调用其他工具编译、安装生成文件及头文件,检查生成文件,存档这几大步骤。其中包含有多线程和多进程操作。

vcpkg.exe(command start) → cmake.exe(call portfile.cmake) → cmake.exe(call CMakeLists.txt) -> vcpkg.exe(post check/archive)

 

小结

    vcpkg作为一个新兴的第三方库集成管理工具,方便了我们使用各式各样的第三方库,减少了工作量。它的设计很有可借鉴性,其中多进程调用、使用配置管理工具等优点可被我们吸收到自己的项目中。

你可能感兴趣的:(教程,介绍)