Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

vcpkg-c++包管理

概述

vcpkg 是一个 C++ 包管理器,用于 Windows、Linux 和 macOS。它由 Microsoft 维护,并支持大量的 C++ 库。使用 vcpkg,你可以轻松地安装、升级和管理 C++ 依赖库。

实践

安装 vcpkg

git clone https://github.com/microsoft/vcpkg

./bootstrap-vcpkg.sh
./vcpkg —version
vcpkg package management program version 2024-04-23-d6945642ee5c3076addd1a42c331bbf4cfc97457

See LICENSE.txt for license information.

vcpkg integrate bash
Adding vcpkg completion entry to /home/abel/.bashrc.

将目录增加到 PATH 里面方便运行。

尝试基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

vcpkg search boost

vcpkg
usage: vcpkg <command> [--switches] [--options=values] [arguments] @response_file
@response_file Contains one argument per line expanded at that location

Package Installation:
export Creates a standalone deployment of installed ports
install Installs a package
remove Uninstalls a package
x-set-installed Installs, upgrades, or removes packages such that that installed matches
exactly those supplied
upgrade Rebuilds all outdated packages

Package Discovery:
x-check-support Tests whether a port is supported without building it
depend-info Displays a list of dependencies for ports
list Lists installed libraries
owns Searches for the owner of a file in installed packages
x-package-info Display detailed information on packages
portsdiff Diffs changes in port versions between commits
search Searches for packages available to be built
update Lists packages that can be upgraded

Package Manipulation:
add Adds dependency to manifest
x-add-version Adds a version to the version database
create Creates a new port
edit Edits a port, optionally with $EDITOR, defaults to "code"
env Creates a clean shell environment for development or compiling
format-manifest Prettyfies vcpkg.json
hash Gets a file's SHA256 or SHA512
x-init-registry Creates a blank git registry
new Creates a new manifest
x-update-baseline Updates baselines of git registries in a manifest to those registries' HEAD
commit

Other:
ci Tries building all ports for CI testing
x-ci-verify-versions Checks integrity of the version database
contact Displays contact information to send feedback
fetch Fetches something from the system or the internet
integrate Integrates vcpkg with machines, projects, or shells

For More Help:
help topics Displays full list of help topics
help <topic> Displays specific help topic
help commands Displays full list of commands, including rare ones not listed here
help <command> Displays help detail for <command>

For more help (including examples) see https://learn.microsoft.com/vcpkg

build

1
2
3
4
# 设置好 VCPKG_ROOT 环境变量
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake
# 当找不到 cmake 文件的时候,可以直接去目录里面搜索一下 *.cmake ,就能解决问题了
${VCPKG_ROOT}/packages/boost-test_xxx/

不要去使用,因为没有用。

1
2
set(CMAKE_TOOLCHAIN_FILE "/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")

在使用 vcpkg 管理项目依赖时,vcpkg.json 是一个配置文件,专门用来定义项目所需的依赖库以及版本信息。通过这种方式,vcpkg 会自动解析并安装这些库,从而让项目构建更加方便和可重复。

vcpkg.json 的主要功能
• 定义项目所依赖的库及版本号。
• 自动管理依赖库的安装、更新和清理。
• 与 CMake 等构建工具无缝集成。

vcpkg.json 文件的基本结构

以下是一个示例的 vcpkg.json 配置文件:

{
“name”: “my-cool-project”,
“version”: “1.0.0”,
“description”: “A project using vcpkg to manage dependencies.”,
“dependencies”: [
{ “name”: “fmt”, “version>=”: “9.1.0” },
“boost”,
“openssl”
],
“builtin-baseline”: “abcd1234efgh5678ijkl9012mnop3456qrst7890”
}

字段说明

1.    name:
•    项目名称,通常是你项目的标识符。
•    例如:"my-cool-project"
2.    version:
•    项目版本号,遵循语义化版本规则。
•    例如:"1.0.0"
3.    description:
•    对项目的简要描述(可选)。
•    例如:"A project using vcpkg to manage dependencies."
4.    dependencies:
•    项目依赖的库,可以是库名或指定版本的对象。
•    支持的格式:
•    仅指定库名:"boost"
•    指定版本范围:{ "name": "fmt", "version>=": "9.1.0" }
5.    builtin-baseline:
•    指定 vcpkg 使用的 Git 基线版本(必须匹配你的 vcpkg 克隆仓库的某次提交),确保依赖解析的一致性。
•    例如:"abcd1234efgh5678ijkl9012mnop3456qrst7890"

使用 vcpkg.json 管理项目依赖

  1. 初始化 vcpkg.json

在项目根目录创建 vcpkg.json 文件并填入依赖信息。例如:

{
“name”: “my-example”,
“version”: “1.0.0”,
“dependencies”: [
“fmt”,
“boost”,
{ “name”: “openssl”, “version>=”: “1.1.1” }
],
“builtin-baseline”: “abcd1234efgh5678ijkl9012mnop3456qrst7890”
}

  1. 运行依赖安装命令

在 vcpkg 根目录下,运行以下命令解析和安装依赖:

vcpkg install

•    该命令会读取项目的 vcpkg.json 文件,自动安装依赖库及其版本。
  1. 与 CMake 项目集成

在项目的 CMakeLists.txt 文件中,启用 vcpkg.json 集成:

CMakeLists.txt

设置 vcpkg 的工具链文件

set(CMAKE_TOOLCHAIN_FILE “${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake”)

项目定义

project(my-example)

添加依赖的库

find_package(fmt CONFIG REQUIRED)
find_package(Boost REQUIRED)

链接库到目标

add_executable(main main.cpp)
target_link_libraries(main PRIVATE fmt::fmt Boost::Boost)

运行 CMake 时会自动解析和使用 vcpkg.json 中定义的依赖。

  1. 其他有用的命令
    • 升级依赖库:

vcpkg upgrade

根据 vcpkg.json 检查并升级依赖库版本。

•    移除未使用的库:

vcpkg remove —outdated

•    查看安装的库:

vcpkg list

依赖版本管理

在 dependencies 中可以使用以下方式定义版本:

1.    不指定版本(默认最新):

“dependencies”: [“fmt”, “boost”]

2.    指定最小版本:

“dependencies”: [
{ “name”: “fmt”, “version>=”: “9.1.0” }
]

3.    指定精确版本:

“dependencies”: [
{ “name”: “fmt”, “version”: “9.1.0” }
]

4.    版本范围(不常用):

“dependencies”: [
{ “name”: “fmt”, “version>=”: “9.0.0”, “version<=”: “9.1.0” }
]

使用场景和优势
• 简化依赖管理:开发者只需定义依赖,vcpkg 自动安装和管理。
• 一致性保证:builtin-baseline 确保团队中的每个人使用相同版本的依赖。
• 版本更新简单:通过更新 vcpkg.json 和 builtin-baseline 即可完成依赖升级。

如果你需要帮助配置具体依赖或项目集成,欢迎提供更多信息!

引用