Skip to content

vcpkg 使用#

vcpkg 是一个开源的 C++ 包管理器,由 Microsoft 开发。它旨在简化在 Windows、Linux 和 macOS 上获取和构建开源 C++ 库的过程。通过 vcpkg,开发者可以轻松管理依赖项,避免手动编译和配置的复杂性。

> vcpkg#

安装配置#

以 Linux 上使用作为示例,详细使用内容请参考官方文档。

设置 vcpkg#

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg && ./bootstrap-vcpkg.sh

添加到 PATH#

将 vcpkg 目录添加到系统 PATH 环境变量中,以便全局使用 vcpkg 命令(例如在 ~/.bashrc 中添加)。

export VCPKG_ROOT=/path/to/vcpkg
export PATH=$VCPKG_ROOT:$PATH

验证安装#

运行 vcpkg version 检查是否安装成功。


使用 CMake 集成包#

# 1. 创建/克隆项目目录
mkdir helloworld && cd helloworld

# 2. 创建清单文件 (vcpkg.json)
vcpkg new --application

# 3. 添加依赖
vcpkg add port fmt

# 4. 安装依赖(默认安装到本地 vcpkg_installed)
vcpkg install

# 5. 构建 helloworld(通用方法,不使用 CMakePresets.json)
mkdir build && cd build
cmake ..  -DCMAKE_BUILD_TYPE=Debug -DVCPKG_INSTALLED_DIR=./vcpkg_installed -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
make

# 6. 运行 helloworld
./helloworld

vcpkg/get_started package查询: packages 示例代码地址: git@github.com:Ts-sound/vcpkg_examples.git


offline#

vcpkg 支持离线安装包,适用于网络受限环境。

导出包#

在有网络的环境中导出包及其依赖:

vcpkg export --zip --output-dir=./exports
  • 导出的是当前工作空间 vcpkg_installed 下的文件,已经编译好的库,如下:
    • 可以作为 SDK 使用
vcpkg_installed
|-- arm64-linux
|   |-- debug
|   |-- include
|   |-- lib
|   `-- share
|-- vcpkg
|   |-- compiler-file-hash-cache.json
|   |-- info
|   |-- manifest-info.json
|   |-- status
|   |-- updates
|   `-- vcpkg-lock.json
`-- x64-linux
    `-- ...

commands/export

离线安装#

在目标机器上解压文件使用, 文件结构:

  • A CMake toolchain at /scripts/buildsystems/vcpkg.cmake
  • MSBuild props/targets at /scripts/buildsystems/msbuild/vcpkg.props and /scripts/buildsystems/msbuild/vcpkg.targets
  • The installation tree at /

注意事项#

  • 需要预先导出所有依赖
  • 确保目标平台与导出平台一致

另一种方法#

  • 直接打包 vcpkg 项目及其 downloads 下的缓存文件。
  • 离线环境配置好后,使用 vcpkg install --no-downloads(仅使用之前下载的文件)。
vcpkg # vcpkg 可执行文件 
...
downloads/
|-- boostorg-accumulators-boost-1.87.0.tar.gz
|-- boostorg-algorithm-boost-1.87.0.tar.gz
|-- boostorg-align-boost-1.87.0.tar.gz
|-- ...

crosscompile#

vcpkg 支持交叉编译,允许在一种平台上为另一种平台构建包。

指定目标 triplet#

使用前需要把交叉编译工具 path 添加到环境变量;

vcpkg install <package>:<triplet>

# e.g. 
vcpkg install fmt:x64-linux

# e.g.  manifest 安装当前工作空间 ,指定 arm64-linux
vcpkg install --triplet arm64-linux

# build helloworld
mkdir build_arm64 && cd build_arm64
cmake ..  -DCMAKE_BUILD_TYPE=Debug -DVCPKG_INSTALLED_DIR=./vcpkg_installed -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \
    -DVCPKG_TARGET_TRIPLET=arm64-linux \
    -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
    -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
    -DCMAKE_SYSTEM_NAME=Linux \
    -DCMAKE_SYSTEM_PROCESSOR=aarch64
make

# 6. check 
file HelloWorld

## out : HelloWorld: ELF 64-bit LSB executable, ARM aarch64, ...

注意事项#

  • 交叉编译工具可以使用 apt 安装 或 自行下载解压。
  • 需要把交叉编译工具 path 添加到环境变量:
# export the cross compiler bin path
export PATH=$PATH:/opt/tong/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
  • vcpkg linux toolchain 逻辑写在 scripts/toolchains/linux.cmake 里面,如下:
    • 所以一般情况下可以直接把我们的 toolchain 的 bin 路径添加到 PATH 环境变量就可以识别了;
set(GNU_TRIPLET "${CMAKE_SYSTEM_PROCESSOR}-linux-gnu")
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
    set(GNU_TRIPLET "arm-linux-gnueabihf")
endif()
if(NOT DEFINED CMAKE_CXX_COMPILER)
    set(CMAKE_CXX_COMPILER "${GNU_TRIPLET}-g++")
endif()
#...

常用 triplets#

  • x64-windows: 64位 Windows
  • x86-windows: 32位 Windows
  • x64-linux: 64位 Linux
  • arm64-linux: ARM64 Linux
  • x64-osx: 64位 macOS

TODO: Package a library with vcpkg#

packaging