Vcpkg 使用全攻略: 支持 VS Code, Visual Studio 和 CLion

在 C++开发中, 管理第三方库一直是一项复杂的任务. Vcpkg 是一个开源的 C++包管理工具, 可以简化库的安装和管理过程. 本文将详细介绍 Vcpkg 的安装, 使用方法, 并展示如何在 CMake 项目中集成 Vcpkg.

为什么选择 Vcpkg

与其他语言相比, C++缺乏官方的包管理工具, 开发者通常需要手动下载, 编译和安装第三方库, 效率低且容易出错. 近年来, 出现了诸如 Conan, Vcpkg, Hunter 等包管理工具, 它们各有特点:

相较于其他工具, Vcpkg 具有以下优势:

安装 Vcpkg

在 Ubuntu 上安装 Vcpkg

环境要求

在开始安装之前, 请确保以下环境已准备好:

如果没有安装, 则可以通过以下命令安装:

sudo apt-get install -y cmake gcc make

1. 克隆 Vcpkg 仓库

通过 Git 克隆 Vcpkg 代码:

git clone --depth 1 https://github.com/microsoft/vcpkg.git

2. 初始化 Vcpkg

cd vcpkg
./bootstrap-vcpkg.sh
export VCPKG_ROOT=$PWD

2. 配置环境变量

将 Vcpkg 添加到系统的 PATH 环境变量中:

export PATH=$VCPKG_ROOT:$PATH

在 Windows 上安装 Vcpkg

环境要求

在开始安装之前, 请确保以下环境已准备好:

1. 下载并安装 Vcpkg

在 Windows 上安装 Vcpkg 相对简单, 首先需要从 Vcpkg 的官方 GitHub 仓库克隆代码:

git clone --depth 1 https://github.com/microsoft/vcpkg.git

2. 初始化 Vcpkg

cd vcpkg
bootstrap-vcpkg.bat

运行bootstrap-vcpkg.bat会自动生成可执行文件vcpkg.exe.

2. 设置环境变量(可选)

建议将vcpkg目录路径添加到系统的环境变量中, 以便可以从任何位置调用它.

  1. 打开"系统属性"对话框.
  2. 转到"高级"选项卡, 点击"环境变量".
  3. 在"系统变量"部分中找到Path, 点击"编辑".
  4. 添加 Vcpkg 路径.
Windows Env Path

如何使用 Vcpkg

以安装fmt库为例:

1. 搜索库:

vcpkg search fmt

输出示例:

fmt                      11.0.2#1         {fmt} is an open-source formatting library providing a fast and safe alter...
log4cxx[fmt]                              Include the log4cxx::FMTLayout class that uses libfmt to layout messages
loguru[fmt]                               Build with fmt support in non-header-only mode
rivers[fmt]                               Use fmt as rivers fommatter
serdepp                  0.1.4.1          c++ 17 universal serialize deserialize library like rust serde, support li...
stronk[fmt]                               Dependencies for fmt extension
The result may be outdated. Run `git pull` to get the latest results.
If your port is not listed, please open an issue at and/or consider making a pull request.  -  https://github.com/Microsoft/vcpkg/issues

2. 安装库:

vcpkg install fmt

输出示例:

Computing installation plan...
A suitable version of cmake was not found (required v3.30.1).
Downloading https://github.com/Kitware/CMake/releases/download/v3.30.1/cmake-3.30.1-linux-x86_64.tar.gz
Extracting cmake...
The following packages will be built and installed:
    fmt:[email protected]#1
Detecting compiler hash for triplet x64-linux...
Compiler found: /usr/bin/c++
Restored 0 package(s) from /home/aronic/.cache/vcpkg/archives in 23.4 us. Use --debug to see more details.
Installing 1/1 fmt:[email protected]#1...
Building fmt:[email protected]#1...
...

3. 列出已安装库

vcpkg list

样例输出:

fmt:x64-windows                                   11.0.2#1            {fmt} is an open-source formatting library provi...
vcpkg-cmake-config:x64-windows                    2024-05-23
vcpkg-cmake:x64-windows                           2024-04-23

在 CMake 中使用 Vcpkg

Demo 工程文件

创建一个名为vcpkg_demo的项目, 该项目使用了第三方库libfmt. 项目包含以下文件:

具体内容如下

  1. CMakeLists.txt

    cmake_minimum_required(VERSION 3.19)
    project(vcpkg_demo)
    
    # 查找 fmt 库
    find_package(fmt CONFIG REQUIRED)
    
    # 添加可执行文件
    add_executable(vcpkg_demo main.cpp)
    
    # 链接 fmt 库
    target_link_libraries(vcpkg_demo PRIVATE fmt::fmt)
  2. main.cpp

    #include <fmt/core.h>
    #include <fmt/ranges.h>
    #include <vector>
    
    int main() {
        fmt::print("Hello world\n");
    
        std::vector<int> v = {1, 2, 3, 4, 5};
        fmt::println("v = {}\n", v);
        return 0;
    }

通过 CMake 命令行参数使用 Vcpkg

使用以下命令生成并构建项目:

cd vcpkg_demo/../ # 在vcpkg_demo的上一级目录
cmake \
 -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake \
 -S vcpkg_demo \
 -B build-vcpkg-demo
cmake --build build-vcpkg-demo

在主流 IDE 中使用 Vcpkg

如下所示的步骤配置起来略显繁琐, 在进阶部分有一种更通用, 更方便的配置方法, 不过他需要更新的 CMake 版本支持. 感兴趣的读者可以直接跳过这一节.

在 VS Code 中使用 Vcpkg

  1. 安装 C++扩展包:

    • 打开 VS Code, 前往扩展市场, 搜索并安装"C/C++ Extension Pack".
      从VS Code插件市场安装C++ Extension Pack
  2. 配置 Vcpkg 路径:

    • 在项目根目录下创建或编辑.vscode/settings.json文件:
      {
        "cmake.configureSettings": {
          "CMAKE_TOOLCHAIN_FILE": "<path_to_vcpkg>/scripts/buildsystems/vcpkg.cmake"
        }
      }
      配置CMake
  3. 生成和构建项目:

    1. 打开命令面板(Ctrl+Shift+P), 选择"CMake: Configure"来生成项目.
      CMake Configure
    2. 选择"CMake: Build"来进行编译.
      CMake Build
    3. 如果中途有失败, 可以删除’build’目录重试

在 Visual Studio 中使用 Vcpkg

  1. 自动检测:

    • 如果已将 Vcpkg 路径添加到环境变量, Visual Studio 会自动检测并集成 Vcpkg.
  2. 手动配置:

    • 在 visual studio 中, 打开 “工具” -> “选项”.
      Visual Studio 选项窗口
    • 如果更新了配置发现还是找不到fmt库, 则删除 out 目录, 重新生成项目.
      Visual Studio 删除out目录截图

在 CLion 中使用 Vcpkg

指定 CMake Toolchain

  1. 配置 CMake Toolchain:

    • 打开 CLion, 前往"File" > “Settings” > “Build, Execution, Deployment” > “CMake”.

      CLion中CMake Toolchain配置截图
    • 在"CMake options"中添加以下内容:

      -DCMAKE_TOOLCHAIN_FILE=<path_to_vcpkg>/scripts/buildsystems/vcpkg.cmake
  2. 同步并构建项目:

    • 右击 CMakeLists.txt 文件并选择Reload CMake Project按钮.
      CLion中CMake Reload截图
    • 也可以从 CMake 插件重载
      CLion Reload CMake From Plugin

CLion Vcpkg 插件

CLion 中有专门针对 Vcpkg 的插件.

  1. 在插件配置中添加一个 Vcpkg 目录
    CLion Vcpkg 配置截图
  2. 通过插件浏览/安装 Vcpkg 库
    CLion Vcpkg 使用截图

进阶使用

使用 CMakePresets.json简化配置

CMake Presets 是 CMake 3.19 版本引入的新特性, 它可以帮助我们简化 CMake 的配置.

在项目根目录下面创建文件 CMakePresets.json

文件内容如下:

{
  "version": 3,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 19,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "vcpkg-demo-preset-linux",
      "generator": "Unix Makefiles",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "/home/aronic/vcpkg/scripts/buildsystems/vcpkg.cmake",
        "CMAKE_BUILD_TYPE": "Debug"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Linux"
      }
    },
    {
      "name": "vcpkg-demo-preset-windows",
      "generator": "Visual Studio 17 2022",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "D:/src/github/vcpkg/scripts/buildsystems/vcpkg.cmake",
        "CMAKE_BUILD_TYPE": "Debug"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Windows"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "vcpkg-demo-build-linux",
      "configurePreset": "vcpkg-demo-preset-linux",
      "jobs": 4,
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Linux"
      }
    },
    {
      "name": "vcpkg-demo-build-windows",
      "configurePreset": "vcpkg-demo-preset-windows",
      "jobs": 4,
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Windows"
      }
    }
  ]
}

简要解释:

  1. configurePresets: 用于定义配置阶段的 Preset, 包含编译器生成器, 构建目录及编译选项.
    • name: 配置的名称
    • generator: 指定生成器类型
    • binaryDir: 指定生成的构建文件的目录.
    • cacheVariables: 定义 CMake 的缓存变量, 例如 CMAKE_TOOLCHAIN_FILECMAKE_BUILD_TYPE.
    • condition: 限定条件, “Linux” 表示该配置仅适用于 Linux 系统.
  2. buildPresets: 用于定义构建阶段的 Preset, 关联某个 configurePreset, 并指定构建选项.
    • name: 构建配置名称.
    • configurePreset: 关联的配置阶段 Preset 名称.
    • jobs: 指定并行构建任务数
    • condition: 限定条件

命令行中使用

cd vcpkg_demo
# 配置项目
cmake --preset vcpkg-demo-preset-linux
# build项目
cmake --build --preset vcpkg-demo-build-linux

在 Windows 下需要更换为:

cd vcpkg_demo
# 配置项目
cmake --preset vcpkg-demo-preset-windows
# build项目
cmake --build --preset vcpkg-demo-build-windows

VS Code 中使用 CMakePresets.json

  1. 打开命令面板(快捷键: Ctrl+Shift+P)
  2. 输入并选择’CMake: Select Configure Preset'
    VS Code 使用 CMakePresets.json 截图
  3. 也可以通过状态栏的工具点击选择
    VS Code CMake Tool 状态栏截图

Visual Studio 中使用 CMakePresets.json

Visual Studio 2022 对 CMake Preset 的支持做的很好, 会自动加载配置, 使用起来非常方便.

Visual Studio Use CMake Preset

CLion 中使用 CMakePresets.json

  1. 在 “File” > “Settings” > “Build, Execution, Deployment” > “CMake”
  2. 启用配置(Enable Profile)
    CLion 启用配置
  3. 启用之后重载 CMake, 即可看到新增的选项
    CLion 启用配置效果图

通过 vcpkg.json 为项目单独定义依赖版本

如果存在多个项目对同一个库的依赖版本不一致的情况, 则可以使用vcpkg.json为项目指定依赖库的版本.

1. 创建项目独立配置

cd vcpkg_demo # 进入工程目录
vcpkg new --application

此时, 会在工程目录下生成一个 vcpkg.json 文件, 由于目前没有指定依赖, 所以文件内容为空.

{}

还有一个 vcpkg-configuration.json 文件, 用于记录工程所使用的库的版本信息. 内容如下:

{
  "default-registry": {
    "kind": "git",
    "baseline": "b7601ed37e1e1ce11a4f61b4b94a23e39d465f1d",
    "repository": "https://github.com/microsoft/vcpkg"
  },
  "registries": [
    {
      "kind": "artifact",
      "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip",
      "name": "microsoft"
    }
  ]
}

该文件随着 vcpkg 版本的更新可能会有变化.

2. 指定项目依赖

vcpkg add port fmt

此时, vcpkg.json文件内容如下:

{
  "dependencies": ["fmt"]
}

3. 安装依赖

vcpkg install

总结

本文系统地介绍了 Vcpkg 的安装, 使用及其在 C++ 项目中的集成方法. 通过 Vcpkg, 开发者可以高效地管理第三方库, 省去手动配置依赖的繁琐过程, 大幅提升开发效率. 本文介绍了 Vcpkg 的优势, 如何安装, 如何与 CMake 集成, 如何在主流 IDE 中使用, 以及CMakePresets.json和通过 vcpkg.json 为项目单独定义依赖版本. 通过本教程, 读者不仅能够快速上手 Vcpkg, 还能灵活地将其集成到各类开发环境中. 如果本文对您有所帮助, 欢迎点赞或分享, 更多精彩内容请关注 Vcpkg 官方文档!

Tags: