vcpkg如何交叉编译
vcpkg
默认用于本机构建(Windows/Linux/macOS),但它也支持交叉编译,尤其在以下场景非常常见:
- 编译 ARM 平台(如树莓派、RK3568、aarch64)
- 编译到 Android/iOS
- 用于嵌入式 Linux 交叉工具链
一、vcpkg 交叉编译的基本原理
vcpkg 使用 triplet(三元组) 来控制目标平台的配置:
<triplet>.cmake
vcpkg 中的交叉编译,其实是通过创建一个自定义 triplet
文件,然后设置交叉工具链路径和 CMake 参数,从而构建出目标平台的库。
二、triplet 配置文件的目录结构
默认路径为:
vcpkg/triplets/arm64-linux.cmake <- 官方 triplettriplets/community/aarch64-rk3568-linux.cmake <- 你可以自定义放这里
也可以用你自己的路径:
my-project/toolchains/rk3568-vcpkg-triplet.cmake
三、编写一个交叉编译 triplet 示例(以 RK3568 为例)
假设你使用的是 Buildroot 工具链 /opt/toolchain/rk3568/aarch64-linux-gcc-v12
:
aarch64-rk3568-linux.cmake
triplet 示例
set(VCPKG_TARGET_ARCHITECTURE arm64)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)
set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "/opt/toolchain/rk3568/aarch64-linux-gcc-v12/toolchain.cmake")
set(VCPKG_CRT_LINKAGE static) # 可选 static/dynamic
set(VCPKG_LIBRARY_LINKAGE static)# 设定 sysroot(重要)
set(VCPKG_ENV_PASSTHROUGH "PKG_CONFIG_SYSROOT_DIR")
set(ENV{PKG_CONFIG_SYSROOT_DIR} "/opt/toolchain/rk3568/aarch64-linux-gcc-v12/sysroot")# 可选:指定 pkg-config 路径(如果目标平台依赖 pkg)
set(ENV{PKG_CONFIG_PATH} "/opt/toolchain/rk3568/aarch64-linux-gcc-v12/sysroot/usr/lib/pkgconfig")
toolchain.cmake
示例
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_SYSROOT /opt/toolchain/rk3568/aarch64-linux-gcc-v12/sysroot)set(CMAKE_C_COMPILER /opt/toolchain/rk3568/aarch64-linux-gcc-v12/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /opt/toolchain/rk3568/aarch64-linux-gcc-v12/bin/aarch64-linux-gnu-g++)# 防止找错头文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
四、使用 vcpkg 编译交叉平台依赖
# 安装指定 triplet 的库
./vcpkg install zlib:x-aarch64-rk3568-linux# 编译依赖并输出到 installed/x-aarch64-rk3568-linux/
你可以把 --triplet=x-aarch64-rk3568-linux
传给 cmake
项目:
cmake -B build \-DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake \-DVCPKG_TARGET_TRIPLET=x-aarch64-rk3568-linux
五、验证构建是否为目标架构
file installed/x-aarch64-rk3568-linux/lib/libz.a
# 输出应为:ELF 64-bit LSB shared object, ARM aarch64 ...
六、注意事项与常见问题
问题 | 原因与解决方式 |
---|---|
构建失败找不到头文件 | 检查工具链是否设定 CMAKE_SYSROOT |
出现 x86_64 架构的库 | 工具链未生效,triplet 或 toolchain.cmake 错误 |
pkg-config 不生效 | 设置 PKG_CONFIG_SYSROOT_DIR 和 PKG_CONFIG_PATH |
要编译的库有主机工具(如 protoc) | 需要提前构建主机版本,使用 --host-triplet |
构建产物混在一起 | 使用 --x-install-root 控制输出路径更清晰 |
七、推荐结构(集成到你的项目中)
my-project/
├── CMakeLists.txt
├── vcpkg.json
├── vcpkg_installed/ <- 存放交叉编译产物
├── toolchains/
│ ├── rk3568-toolchain.cmake
│ └── rk3568-triplet.cmake
总结
项目 | 支持情况 |
---|---|
交叉编译到 Linux ARM | ✅ 支持良好 |
与自定义工具链结合 | ✅ 只需设置 Toolchain 和 triplet |
支持主机工具交叉(如 protoc ) | ⚠️ 要分离主机/目标构建 |
易于集成到 CI/CD | ✅ 可用 json、triplet 自动拉依赖 |