开发C/C++程序时,少不了编译开源的第三方库,但是编译和使用第三方库时,往往存在着诸多问题:
- 编译方式:有的基于configure、make,有的基于vc工程,有的基于cmake等等。
- 编译类型:debug还是release、动态库还是静态库、32位还是64位等等。
- 编译环境:开源库可能还依赖于其他第三方库,环境准备也是难点。
- 集成第三方库:根据软件项目类型及环境,工程目录也必须仔细设定才能保证软件项目能够正常编译。
为解决以上痛点,微软推出了开源工具vcpkg,项目地址:https://github.com/microsoft/vcpkg,它具备以下优点:
- 多平台支持,Windows、Linux和MacOS。
- 多编译类型支持。
- 自动检查编译关系并准备。
- 源码包的缓存管理和版本管理,支持升级版本。
- 轻松编译。
- 集成Visual Studio与cmake项目,只需简单配置。
安装
Windows
环境需求:
- Windows 7或更新的版本。
- Git
- 编译环境:Visual Studio 2015或最新版本、Mingw等(自选)。
下载vcpkg源码并执行bootstrap脚本:
git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap_vcpkg.bat
Unix
Linux环境需求:
- Git
- g++ >= 6
MscOS环境需求:
- Apple Developer Tools
- MacOS 10.14及更低版本中,还需要:
- Homebrew
- Homebrew中g++ >= 6
下载vcpkg源码并执行bootstrap脚本:
git clone https://github.com/microsoft/vcpkg
./vcpkg/bootstrap_vcpkg.sh
使用
以下主要以Windows平台为例。
使用前,建议将vcpkg路径设置到系统环境变量PATH中,这样方便在任意路径下直接执行vcpkg。
库管理
列出已编译库:
vcpkg list
根据关键字搜索vcpkg支持编译的库,其中PACKAGE为该关键字:
vcpkg search PACKAGE
安装库,这里先说一下,vcpkg支持编译多种类型的库,默认为x86-windows,也就是32位的vs平台编译的版本。这里可以通过指令查看vcpkg支持编译的类型:
vcpkg help triplet
可以看到:
Available architecture triplets
VCPKG built-in triplets:
arm-uwp
arm64-windows
x64-linux
x64-osx
x64-uwp
x64-windows-static
x64-windows
x86-windows
VCPKG community triplets:
arm-android
arm-ios
arm-linux
arm-mingw-dynamic
arm-mingw-static
arm-neon-android
arm-windows
arm64-android
arm64-ios
arm64-linux
arm64-mingw-dynamic
arm64-mingw-static
arm64-osx-dynamic
arm64-osx
arm64-uwp
arm64-windows-static-md
arm64-windows-static
armv6-android
ppc64le-linux
s390x-linux
wasm32-emscripten
x64-android
x64-ios
x64-mingw-dynamic
x64-mingw-static
x64-openbsd
x64-osx-dynamic
x64-windows-static-md
x86-android
x86-freebsd
x86-ios
x86-mingw-dynamic
x86-mingw-static
x86-uwp
x86-windows-static-md
x86-windows-static
x86-windows-v120
所以,当安装库时,我们可以选择相应的类型,其中PACKAGE为库名,TRIPLET为指定编译的类型:
vcpkg install PACKAGE:TRIPLET
也可以通过配置系统环境变量来指定默认编译的类型,其中TRIPLET为指定编译的类型:
VCPKG_DEFAULT_TRIPLET = TRIPLET
移除指定库,其中PACKAGE为库名,TRIPLET为指定编译的类型:
vcpkg remove PACKAGE:TRIPLET
更新所有库:
vcpkg update
vcpkg也支持导出已编译的库,支持导出的格式有raw、nuget、zip、7zip、ifw,必须在命令行中指定导出格式,其中PACKAGE为库名,TRIPLET为指定编译的类型,TYPE为导出的类型:
vcpkg export PACKAGE:TRIPLET --TYPE
集成
编译好第三方库后,如何使用呢?传统模式中,我们需要配置include目录、lib目录,添加编译选项等等,这里vcpkg提供了更便捷的集成方式。
集成到Visual Studio
全局集成
运行以下命令 (首次启动需要管理员权限):
vcpkg integrate install
无需其他命令,即可在任意Visual Studio项目中直接使用库。
移除集成也很简单,运行以下命令:
vcpkg integrate remove
工程集成
很多时候我们希望自定义处理第三方库或者根本不想集成第三方库,那么工程集成就是最灵活的处理方式。
运行以下命令,会在vcpkg_root\scripts\buildsystems下生成nuget文件:
vcpkg integrate project
打开Visual Studio,点击“工具->NuGet包管理器->程序包管理器设置”,进入设置界面,点击左侧“程序包源”,右侧点击“加号”添加一个源,名称改为vcpkg,源选择vcpkg_root\scripts\buildsystems目录,点击“更新”,点击“确定”关闭设置对话框。
当希望将vcpkg的第三方包集成到某个工程时,在Visual Studio中右键需要设置的工程,选择“管理NuGet程序包”,右上角的“程序包源”中选择上面设置的“vcpkg”,在“浏览”选项卡中就可以看到“vcpkg.H.Repos.vcpkg”,点击最右侧的安装,这样就只针对于此工程集成vcpkg的第三方包了。
集成到cmake工程
跨平台安装(编译)工具cmake越来越火,所以针对cmake工程vcpkg也提供了相应的集成解决方案。
通过修改cmake命令行参数
只需在命令行中添加以下内容就行,其中vcpkg_root为vcpkg安装的根目录:
-DCMAKE_TOOLCHAIN_FILE=vcpkg_root/scripts/buildsystems/vcpkg.cmake"
如果是链接静态库,还需要添加额外的内容,以x64-mingw-static为例:
-DVCPKG_TARGET_TRIPLET=x64-mingw-static
通过修改CMakeLists.txt
以下添加所有内容务必要在CMakeLists.txt中project()之前,保证cmake可以加载到toolchain,其中vcpkg_root为vcpkg安装的根目录:
set(CMAKE_TOOLCHAIN_FILE "vcpkg_root/scripts/buildsystems/vcpkg.cmake")
如果是链接静态库,还需要添加额外的内容,以x64-mingw-static为例:
set(VCPKG_TARGET_TRIPLET "x64-mingw-static")
最新评论