当前位置: 首页 > ai >正文

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_DIRPKG_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 自动拉依赖
http://www.xdnf.cn/news/16278.html

相关文章:

  • HCLP--MGER综合实验
  • 数据结构习题--删除排序数组中的重复项
  • 详解力扣高频SQL50题之1084. 销售分析 III【简单】
  • Python点阵字生成与优化:从基础实现到高级渲染技术
  • 数据恢复与备份
  • 快速入门Linux操作系统(一)
  • 立式加工中心X-Y轴传动机械结构设“cad【6张】三维图+设计说明书
  • 进阶数据结构:用红黑树实现封装map和set
  • 学习嵌入式的第三十一天-数据结构-(2025.7.23)网络协议封装
  • 数据中心-时序数据库InfluxDB
  • 掌握Gemini-2.5:现代AI开发中实用应用的综合指南
  • 二次函数图像动画展示
  • 在Power Automate Desktop中执行PowerShell获取SharePoint online某个文件夹的用户权限列表
  • excel删除重复项场景
  • 算法竞赛阶段二-数据结构(35)数据结构单链表模拟实现
  • Node.js 模拟 Linux 环境
  • 【每天一个知识点】GAN(生成对抗网络,Generative Adversarial Network)
  • Whisper语音转文字
  • 【洛谷】单向链表、队列安排、约瑟夫问题(list相关算法题)
  • 互联网应用主流框架整合 Spring Boot开发
  • Linux DNS 服务器正反向解析
  • 【IMMCKF】基于容积卡尔曼滤波(CKF)的多模型交互的定位程序,模型为CV和CT,三维环境,matlab代码|附下载链接
  • Nestjs框架: 基于Mongodb的多租户功能集成和优化
  • 算子推理是什么
  • 电脑开机后网络连接慢?
  • (Python)文件储存的认识,文件路径(文件储存基础教程)(Windows系统文件路径)(基础教程)
  • 【17】C# 窗体应用WinForm ——【文本框TextBox、富文本框RichTextBox 】属性、方法、实例应用
  • C++:list(2)list的模拟实现
  • Java中配置两个r2db连接不同的数据库
  • JavaScript:现代Web开发的核心动力