在 CMake 工具链中加入vcpkg

摘要

这篇文章继续记录我与 C++ 生态打架的精彩记录,主要记录一些配置文件的编写,便于日后参考第三方库的安装。

安装 vcpkg

与终端交互中完成如下配置(刚装的系统会有一些基础依赖需要按照报错提示自行安装)

1
2
3
4
5
6
7
# 下载并初始化
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg && ./bootstrap-vcpkg.sh
# 设置环境变量并刷新
export VCPKG_ROOT=/path/to/vcpkg # 这里要自己替换路径, 个人喜欢放到 ~/.bashrc 中永久保存
export PATH=$VCPKG_ROOT:$PATH
source ~/.bashrc

开始使用 vcpkg

  1. 这里参考官方的例子先给出基本的 CMakeLists.txt 文件和 main.cc 文件

    CMakeLists.txt

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cmake_minimum_required(VERSION 3.10)

    project(HelloWorld)

    find_package(fmt CONFIG REQUIRED)

    add_executable(Main main.cc)

    target_link_libraries(HelloWorld PRIVATE fmt::fmt)

    main.cc

    1
    2
    3
    4
    5
    6
    #include <fmt/core.h>

    int main() {
    fmt::print("Hello World!\n");
    return 0;
    }
  2. 由于网络时不时会遭受神秘力量的攻击, 这里可以通过设置环境变量更换镜像源

1
2
export X_VCPKG_ASSET_SOURCES=x-azurl,http://106.15.181.5/
source ~/.bashrc
  1. 为了能让 CMake 工具链加入 vcpkg,需要设置 CMKAE_TOOLCHAIN_FILE 这个值,官网给出了三种方法
  • 在 CMakePresets.json 中进行设置
1
2
3
4
5
6
7
8
9
10
11
12
{
"version": 3,
"configurePresets": [
{
"name": "default",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
}
}
]
}
  • 在 CMakeLists.txt 中进行设置,不过要写在 project() 这一行之前
1
set(CMAKE_TOOLCHAIN_FILE "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
  • 在使用cmake指令进行工程构建的时候加入 -D 选项
1
cmake -DCMAKE_TOOLCHAIN_FILE="$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
  1. 在希望使用 vcpkg 的项目中使用如下指令初始化 vcpkg 管理
1
vcpkg new --application
  1. 之后可以使用如下命令进行依赖的添加,比如我这里需要添加 fmt 库,回车之后会发现 vcpkg.json 中多了这一项依赖
1
vcpkg add port fmt 
  1. 之后就可以使用 cmake 指令进行构建编译了,加上 --preset 选项设置配置文件为上述 CMakePresets.json 中的 default 配置
1
2
3
mkdir build && cd build
cmake --preset=default ..
cmake --build .
  1. 构建成功即可运行(实际上大概率遇到一堆小问题,这里就即兴发挥了 :happy:
1
2
./Main
# Hello World!

  • 实际上 vcpkg 安装包有两种模式:classicmanifest (上文使用的就是这种方式,也是官方推荐的 )

    • manifest: 相当于每次安装库的位置都是项目 build 文件夹内

    • classic: 相当于全局安装,库安装在在 VCPKG_ROOT的文件夹中;在设置了 vcpkg 工具链的项目中, 每次安装都会从这个全局目录中寻找缓存,大大加快安装速度;该模式安装使用另一条指令

      1
      vcpkg install <lib> 
  • 另外贴上 vcpkg 页面 https://learn.microsoft.com/en-us/vcpkg/