vcpkg¶
简介¶
Vcpkg 是由 Microsoft 和 C++ 社区维护的免费开源 C/C++ 包管理器,可在 Windows、macOS 和 Linux 上运行。 它是核心的 C++ 工具,使用 C++ 和 CMake 脚本编写。 它旨在解决管理 C/C++ 库的独特难题。
为什么使用 vcpkg?¶
- 在特选注册表中有超过2300 个开源库可供选择,这些库会定期生成,用于验证 ABI 兼容性
- 支持使用自己的自定义库包创建自定义库注册表
- 适用于 Windows、macOS 和 Linux 的一致的跨平台体验
- 使用任何生成和项目系统都可以轻松将库添加到项目
- 从源生成依赖项或下载预生成的 ABI 验证二进制文件,默认提供 70 多个配置,并可针对特定要求进行无限自定义
- 通过独特的版本控制设计,防止依赖项之间出现版本冲突和菱形依赖问题
- 对于 MSBuild 和 CMake 用户:自动与生成环境集成,打造无缝获取依赖项的体验
第一个示例¶
安装Vcpkg¶
- GitHub 克隆 vcpkg 存储库
存储库包含用于获取 vcpkg 可执行文件的脚本,以及由 vcpkg 社区维护的特选开放源代码库的注册表。vcpkg 特选注册表是一组数量超过 2000 个的开源库。 这些库已通过 vcpkg 的持续集成管道进行验证,可以协同工作。 虽然 vcpkg 存储库不包含这些库的源代码,但它保存方案和元数据,以便在系统中生成和安装它们。
-
安装vcpkg
-
配置环境变量
创建项目¶
创建项目目录
创建清单文件
添加fmt
依赖项
创建CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
find_package(fmt CONFIG REQUIRED)
add_executable(HelloWorld helloworld.cpp)
target_link_libraries(HelloWorld PRIVATE fmt::fmt)
示例源码
运行生成Cmake配置
创建CMakePresets.json
文件:
{
"version": 2,
"configurePresets": [
{
"name": "vcpkg",
"generator": "Unix Makefiles",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
}
}
]
}
创建CMakeUserPresets.json
:
{
"version": 2,
"configurePresets": [
{
"name": "default",
"inherits": "vcpkg",
"environment": {
"VCPKG_ROOT": "<path to vcpkg>"
}
}
]
}
CMakePresets.json
文件中将 CMAKE_TOOLCHAIN_FILE
设置为使用 vcpkg 的自定义工具链时,CMake 可以自动链接 vcpkg 安装的库。 CMakeUserPresets.json
文件会将 VCPKG_ROOT
环境变量设置为指向包含 vcpkg 本地安装的绝对路径。 建议不要将 CMakeUserPresets.json
签入版本控制系统。
生成Cmake配置:
运行项目
第二个示例:手动安装依赖¶
创建项目目录
创建源文件main.cpp
#include <cxxopts.hpp>
#include <fmt/format.h>
#include <range/v3/view.hpp>
namespace view = ranges::views;
int fib(int x)
{
int a = 0, b = 1;
for (int it : view::repeat(0) | view::take(x))
{
(void)it;
int tmp = a;
a += b;
b = tmp;
}
return a;
}
int main(int argc, char **argv)
{
cxxopts::Options options("fibo", "Print the fibonacci sequence up to a value 'n'");
options.add_options()("n,value", "The value to print to", cxxopts::value<int>()->default_value("10"));
auto result = options.parse(argc, argv);
auto n = result["value"].as<int>();
for (int x : view::iota(1) | view::take(n))
{
fmt::print("fib({}) = {}\n", x, fib(x));
}
}
手动添加依赖
手动创建CMakeLists.txt
文件
cmake_minimum_required(VERSION 3.15)
project(fibonacci CXX)
find_package(fmt REQUIRED)
find_package(range-v3 REQUIRED)
find_package(cxxopts REQUIRED)
set(CMAKE_CXX_STANDARD 17)
add_executable(fibo main.cxx)
target_link_libraries(fibo
PRIVATE
fmt::fmt
range-v3::range-v3
cxxopts::cxxopts)
手动配置Cmake
生成项目
运行项目