vcpkg是微软出品的一个开源第三方库集成管理工具,用于改善Windows中混乱不堪的集成环境。
在*inx中,我们有各发行版集成的包管理软件,如apt、yum等,使用它们可便捷的安装/卸载/升级第三方库。但是在Windows中并没有一个统一的(大多数人使用)集成管理工具。现已知的有:
这些集成管理工具或多或少有些局限性,并不能满足拿来就能使用的所有场景。所以,微软发起了vcpkg项目,希望补足这个短板。
通常我们在日常开发工作中需要使用大量的第三方库(避免造轮子),例如:openssl,sqlite3,mysql,boost等等。我们需要将其源码下载下来,查阅官方编译文档进行编译,并集成进自己的项目中。并在CI中使用它们。通常的,过一段时间也需要更新这些库的源码,重新编译以解决库本身bug/使用库的新功能。
嗯,都是工作量呐!甚至于大一点的公司中,由于许多项目使用了一些通用的第三方库,为了解决集成管理这些库的问题,需要专人负责并维持一个统一的版本。hmm...这不是跟vcpkg很像吗?甚至于一些框架(qt、tensorflow)也集成进vcpkg中。
vcpkg作为一个通用的第三方库集成管理器,可以:
等等...
vcpkg所有源码存储在github上,我们可以使用git下载它:
> git clone https://github.com/Microsoft/vcpkg.git
> cd vcpkg
或直接下载源码压缩包解压。
编译vcpkg需要Visual Studio 2015 Update 3或更新的版本(Windows) / gcc(*inx) / darwin(macos),执行下列命令:
Windows> .\bootstrap-vcpkg.bat
Linux/MacOS:~/$ ./bootstrap-vcpkg.sh
完成后,vcpkg就可以使用了。
Windows> .\vcpkg install sdl2 curl
*inx/MacOS:~/$ ./vcpkg install sdl2 curl
安装完成后,我们可以在 VCPKG_PATH/installed/DEFAULT_TRIPLET/ 中看见生成的头文件、静态库、动态库、工具及说明等文件。
vcpkg支持集成至本机环境功能,但目前仅限于Visual Studio和cmake。使用以下命令来集成:
Windows> .\vcpkg integrate install
*inx/MacOS:~/$ ./vcpkg integrate install
执行完成后,请重启Visual Studio(使用Visual Studio时)。现在,我们打开一个新工程,不需要添加任何路径至配置中就可以使用#include调用头文件,亦不需要添加第三方库名称至加载库列表中。并且在使用msvc工程时,生成自己的项目后还会自动复制使用到的动态库喔!
当然,对于其他工具,请将以下路径加入对应路径中:
使用命令export导出已经安装的库:
Windows> .\vcpkg export sdl2:x64-windows-static sdl2:arm-uwp --zip
*inx/MacOS:~/$ ./vcpkg export sdl2:x64-linux-dynamic --zip
完成后我们可以在vcpkg根目录下找到这些压缩包,并移动至其他环境使用。
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作为一个新兴的第三方库集成管理工具,方便了我们使用各式各样的第三方库,减少了工作量。它的设计很有可借鉴性,其中多进程调用、使用配置管理工具等优点可被我们吸收到自己的项目中。