文章目录
- 使用vcpkg管理依赖第三库
- vcpkg安装
- vcpkg经典模式使用
- 从仓库列表搜索依赖项
- 从某个基线版本的列表中查询某个依赖项信息
- 安装依赖库
- vcpkg清单模式的使用
- vcpkg清单模式的使用例子说明
使用vcpkg管理依赖第三库
vcpkg 有两种操作模式:经典模式和清单模式。
在经典模式下,使用 vcpkg 作为命令行接口在vcpkg 安装目录中安装依赖项。 通常,位于中 %VCPKG_ROOT%/installed,其中 %VCPKG_ROOT% 是 vcpkg 的安装目录。
在清单模式下,在新建项目文件夹,在名为 vcpkg.json的清单文件中声明项目的直接依赖项。此模式下,会根据清单文件生成项目自己的vcpkg_installed目录,用于安装依赖项,这与经典模式不同,经典模式的所有包都安装在公共 %VCPKG_ROOT%/installed 目录中。 因此,每个项目都可以有自己的清单和自己的一组不与其他项目的依赖项冲突的依赖项。
而且,只有清单模式才能使用高级功能,例如 版本控制 和 自定义注册表。
使用清单模式安装包,这是大多数用户推荐的工作流。
vcpkg安装
找到vcpkg的github目录
克隆到本地目录:
> git clone https://github.com/Microsoft/vcpkg
进入vcpkg目录,启动安装:
> .\vcpkg\bootstrap-vcpkg.bat
等待程序下载vcpkg.exe结束,脚本运行完毕。
这里需要注意:
1.必须用git下载vcpkg工作空间,否则项目清单模式应用时,为项目依赖库添加版本控制时,命令‘vcpkg x-update-baseline --add-initial-baseline’无法为清单文件添加基线版本。
2.windows平台使用PowerShell工具,且需要最新版本,找到PowerShell的github官网下载安装。
vcpkg经典模式使用
从仓库列表搜索依赖项
> vcpkg search zlib
从某个基线版本的列表中查询某个依赖项信息
> git show 2815578f4a3486cec24c9b07d17e18e03bbaf667:versions/baseline.json | egrep -A 3 -e '"zlib"|"fmt"|"curl"'
注意:
1.基线版本号就是vcpkg的github目录的提交记录的SHA哈希值。
2.egrep 是unix和linux中的命令,故需要在git的命令行窗口来使用。
关于基线版本号如何获取?
首先到vcpkg的github官网,然后找到commits,如下图所示
在commits页面,选择需要的提交版本号的SHA哈希值
安装依赖库
# 默认安装
> vcpkg install curl
# 安装支持OpenSSL的curl
> install curl[openssl]
# 安装支持OpenSSL和LibSHH2的curl
> install curl[openssl,ssh]
vcpkg清单模式的使用
vcpkg清单模式的使用例子说明
示例项目文件目录
hello
| -- build/ : 项目的CMake构建目录
| -- CMakeLists.txt : 项目的CMake文件
| -- main.cpp
L -- vcpkg.json : vcpkg的项目级管理清单文件
main.cpp:
#include <fmt/core.h>
#include <zlib.h>
int main()
{
fmt::print("fmt version is {}\n"
"zlib version is {}\n",
FMT_VERSION, ZLIB_VERSION);
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.18)
project(versionstest CXX)
add_executable(main main.cpp)
find_package(ZLIB REQUIRED)
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)
vcpkg.json:
{
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
"name": "hello",
"version": "0.0.1",
"description": "vcpkg study tutorial: hello",
"dependencies": [
"fmt",
{
"name": "zlib",
"platform": "windows & x64"
},
{
"name": "curl",
"platform": "windows & x64",
"version>=": "8.1.2",
"features": [
"ssh",
{
"name": "openssl",
"platform": "windows & x64"
}
]
}
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "fmt",
"version": "10.1.1"
}
]
}
构建流程:
# %VCPKG_ROOT%表示VCPKG.exe所在的根目录
> cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
# CMake构件编译系统后,针对Visual Studio项目,需要用软件打开sln解决方案编译
说明:
使用基线添加版本约束:
# 针对vcpkg.json清单文件未添加"builtin-baseline"的情况,在清单文件所在目录运行命令:
> vcpkg x-update-baseline --add-initial-baseline
使用基线添加版本约束的含义是,基线确定了vcpkg的github仓库中各个库包的最低版本。
添加最低版本约束:
基线不是锁定包版本的唯一方法。 vcpkg 还接受形式的 **version>=**最低版本约束。
"dependencies": [
"fmt",
{
"name": "zlib",
"platform": "windows & x64"
},
{
"name": "curl",
"platform": "windows & x64",
"version>=": "8.1.2",
...
强制使用特定版本:
在某些情况下,可能需要强制使用特定版本的包,例如:
- 解决版本冲突。
- 锁定早于基线的版本。
- 锁定其他无法比拟的版本,例如: vista、 xp。
...
"overrides": [
{
"name": "fmt",
"version": "10.1.1"
}
]
...
关于使用基线添加版本约束
、添加最低版本约束
、强制使用特定版本
三者的关系:
见示例:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
3426db05b996481ca31e95fff3734cf23e0f51bc使用基线添加版本约束:
- fmt:“version>=”: “7.1.3”
- zlib:“version”:“1.2.11”
添加最低版本约束:
- fmt:“version>=”: “10.1.1”
强制使用特定版本:
- zlib:“version”:“1.2.8”
安装时,fmt最终采用了添加最低版本约束
,zlib最终采用了强制使用特定版本
。
说明:强制使用特定版本
有最高优先级,使用基线添加版本约束
比强制使用特定版本
的版本低时,使用强制使用特定版本
。