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

cmake之旅(11)

cmake之旅11cmake之旅11交叉编译与工具链文件1 什么是交叉编译2 交叉编译的前提安装交叉编译工具链3 工具链文件3.1 基本结构3.2 关键变量说明4 使用工具链文件5 实战为树莓派交叉编译6 Android 交叉编译7 交叉编译中的常见问题8 本篇命令速查表9 总结与下一篇预告同系列文章cmake之旅(1):构建的过程cmake之旅(2):CMakeLists.txt 核心语法cmake之旅(3):多目录项目管理cmake之旅(4):静态库与动态库cmake之旅5):函数、宏与 .cmake 模块cmake之旅6查找和使用第三方库cmake之旅7编译选项与条件编译cmake之旅8Modern CMake 与 target 思维cmake之旅9安装与导出cmake之旅10自动化测试与 CTestcmake之旅11交叉编译与工具链文件cmake之旅12CPack 打包与发布cmake之旅11交叉编译与工具链文件前面的篇章中我们编译出来的程序都是在本机上运行的——在 x86 的电脑上编译在 x86 的电脑上运行。但实际工作中有一个很常见的场景在一种平台上编译在另一种平台上运行。比如在 x86 电脑上编译但程序要跑在 ARM 嵌入式开发板上。这就是交叉编译Cross Compilation。CMake 通过工具链文件Toolchain File来支持交叉编译。工具链文件本身就是一个.cmake文件——看到了吗第五篇学的.cmake文件知识又派上用场了。1 什么是交叉编译先明确几个概念术语含义示例宿主机Host你正在使用的开发机器x86_64 Linux 电脑目标机Target程序最终要运行的机器ARM 开发板、树莓派本地编译宿主机和目标机是同一平台x86 上编译x86 上运行交叉编译宿主机和目标机是不同平台x86 上编译ARM 上运行为什么需要交叉编译因为目标机器往往性能有限嵌入式设备可能只有几百 MHz 的 CPU 和几十 MB 的内存在上面直接编译大型项目非常缓慢甚至不可能。而开发机性能强劲编译速度快得多。2 交叉编译的前提安装交叉编译工具链交叉编译需要一套专门的编译器和工具它们能生成目标平台的机器码。以 ARM 为例在 Ubuntu 上安装交叉编译工具链sudoapt-getinstallgcc-aarch64-linux-gnu g-aarch64-linux-gnu安装后你就有了以下工具工具用途aarch64-linux-gnu-gccARM 平台的 C 编译器aarch64-linux-gnu-gARM 平台的 C 编译器aarch64-linux-gnu-arARM 平台的静态库打包工具aarch64-linux-gnu-ldARM 平台的链接器这些工具运行在 x86 机器上但生成的是 ARM 平台的代码。3 工具链文件工具链文件是一个.cmake文件它告诉 CMake不要用本机的编译器去用交叉编译器。3.1 基本结构一个典型的 ARM 交叉编译工具链文件toolchain-aarch64.cmake# 目标系统信息 set(CMAKE_SYSTEM_NAME Linux) # 目标操作系统 set(CMAKE_SYSTEM_PROCESSOR aarch64) # 目标处理器架构 # 交叉编译工具链路径前缀 set(CROSS_COMPILE_PREFIX aarch64-linux-gnu) # 指定 C 和 C 编译器 set(CMAKE_C_COMPILER ${CROSS_COMPILE_PREFIX}-gcc) set(CMAKE_CXX_COMPILER ${CROSS_COMPILE_PREFIX}-g) # 指定其他工具可选CMake 通常能自动推导 set(CMAKE_AR ${CROSS_COMPILE_PREFIX}-ar) set(CMAKE_LINKER ${CROSS_COMPILE_PREFIX}-ld) # Sysroot目标平台的系统根目录包含目标平台的标准库和头文件 # 如果你有单独的 sysroot取消下面这行的注释并修改路径 # set(CMAKE_SYSROOT /path/to/arm-sysroot) # 查找策略只在目标平台路径中查找库和头文件不要混入宿主机的 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 程序工具仍在宿主机上找 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 库只在目标平台找 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 头文件只在目标平台找 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) # 包只在目标平台找3.2 关键变量说明CMAKE_SYSTEM_NAME这是工具链文件中最重要的一个变量。当你设置了CMAKE_SYSTEM_NAME且它与当前宿主机系统不同时CMake 就知道这是交叉编译了。常见的值Linux、Windows、DarwinmacOS、Android、QNX等。如果目标系统是裸机没有操作系统的嵌入式系统使用Genericset(CMAKE_SYSTEM_NAME Generic)CMAKE_FIND_ROOT_PATH_MODE_xxx这些变量控制find_package、find_library、find_path等查找命令的行为。在交叉编译时你不希望 CMake 找到宿主机上的库那些是 x86 的不能给 ARM 用所以把 LIBRARY、INCLUDE、PACKAGE 的查找模式设为ONLY——只在目标平台的路径中搜索。但 PROGRAM 设为NEVER——因为像protoc、flatc这样的代码生成工具需要在宿主机上运行它们在编译阶段运行不是在目标机上运行。4 使用工具链文件使用方式非常简单——在第一次运行cmake时通过CMAKE_TOOLCHAIN_FILE指定工具链文件mkdirbuild-armcdbuild-arm cmake-DCMAKE_TOOLCHAIN_FILE../toolchain-aarch64.cmake..make注意事项第一CMAKE_TOOLCHAIN_FILE必须在第一次运行cmake时指定。它不能在 CMakeLists.txt 中设置也不能在第二次运行时更改因为它影响的是编译器检测等初始化步骤。第二建议为交叉编译创建独立的构建目录如build-arm与本地构建的目录如build分开。第三交叉编译出来的可执行文件不能在宿主机上直接运行./Calculator# 报错这是 ARM 程序x86 机器跑不了可以用file命令确认编译结果fileCalculator# 输出类似Calculator: ELF 64-bit LSB executable, ARM aarch64, ...5 实战为树莓派交叉编译树莓派 4 使用 ARM Cortex-A72 处理器。我们来写一个完整的交叉编译示例。toolchain-rpi4.cmake# 目标系统 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) # 编译器 set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER 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) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)项目结构和之前的 Calculator 完全一样CMakeLists.txt 不需要做任何修改。这就是工具链文件的优势——构建逻辑和平台信息完全分离。# 本地构建mkdirbuild-nativecdbuild-native cmake..make# 交叉编译同一套源码只是换了工具链文件mkdirbuild-rpi4cdbuild-rpi4 cmake-DCMAKE_TOOLCHAIN_FILE../toolchain-rpi4.cmake..make编译完成后把可执行文件拷贝到树莓派上运行即可scpCalculator pi192.168.1.100:~/sshpi192.168.1.100./Calculator6 Android 交叉编译Android NDK 自带了工具链文件这是一个更复杂但非常实用的交叉编译场景cmake\-DCMAKE_TOOLCHAIN_FILE$ANDROID_NDK/build/cmake/android.toolchain.cmake\-DANDROID_ABIarm64-v8a\-DANDROID_PLATFORMandroid-24\..Android 的工具链文件由 Google 维护支持通过额外变量如ANDROID_ABI、ANDROID_PLATFORM来配置目标架构和 API 级别。你不需要自己编写工具链文件直接使用 NDK 提供的即可。这个例子告诉我们很多平台Android、iOS、QNX 等都提供了现成的工具链文件。在交叉编译之前先看看目标平台是否已经提供了工具链文件避免重复造轮子。7 交叉编译中的常见问题问题一find_package 找不到目标平台的库交叉编译时find_package默认不会在宿主机路径中搜索因为我们设了ONLY。如果目标平台的库安装在非标准路径需要设置CMAKE_FIND_ROOT_PATH# 在工具链文件中 set(CMAKE_FIND_ROOT_PATH /path/to/arm-sysroot /path/to/arm-libs)或者在命令行指定cmake-DCMAKE_FIND_ROOT_PATH/path/to/arm-libs...问题二try_run 失败CMake 有些模块或configure_file检查需要编译并运行测试程序。在交叉编译环境下编译出来的程序是目标平台的无法在宿主机上运行。解决方式一在工具链文件中设置模拟器set(CMAKE_CROSSCOMPILING_EMULATOR qemu-aarch64)这样 CMake 会通过 QEMU 模拟器来运行测试程序。解决方式二如果不需要try_run可以通过缓存变量跳过检查。问题三CTest 在交叉编译时怎么用同样需要设置CMAKE_CROSSCOMPILING_EMULATOR。设置后ctest会自动通过模拟器运行测试# 工具链文件中 set(CMAKE_CROSSCOMPILING_EMULATOR qemu-aarch64)ctest# 自动用 qemu-aarch64 运行每个测试8 本篇命令速查表工具链文件中的关键变量变量含义示例CMAKE_SYSTEM_NAME目标操作系统Linux / Windows / Android / GenericCMAKE_SYSTEM_PROCESSOR目标处理器架构aarch64 / armv7 / x86_64CMAKE_C_COMPILERC 编译器aarch64-linux-gnu-gccCMAKE_CXX_COMPILERC 编译器aarch64-linux-gnu-gCMAKE_SYSROOT目标平台的系统根目录/path/to/sysrootCMAKE_FIND_ROOT_PATH额外的查找根路径/path/to/arm-libsCMAKE_CROSSCOMPILING_EMULATOR交叉编译模拟器qemu-aarch64查找模式设置变量推荐值说明CMAKE_FIND_ROOT_PATH_MODE_PROGRAMNEVER工具在宿主机上找CMAKE_FIND_ROOT_PATH_MODE_LIBRARYONLY库只在目标平台找CMAKE_FIND_ROOT_PATH_MODE_INCLUDEONLY头文件只在目标平台找CMAKE_FIND_ROOT_PATH_MODE_PACKAGEONLY包只在目标平台找9 总结与下一篇预告这一篇我们学习了交叉编译的概念、工具链文件的编写和使用以及交叉编译中的常见问题。工具链文件的核心价值在于把平台信息从构建逻辑中完全分离——同一套 CMakeLists.txt 可以通过不同的工具链文件编译到不同的目标平台无需修改任何构建代码。到此为止我们的项目可以构建、测试、安装、还能交叉编译到不同平台。最后一个环节是怎么把这一切打包成一个安装包分发给最终用户总不能让用户自己cmake make make install吧。下一篇——cmake之旅12CPack 打包与发布我们来学习如何把项目打包成 deb、rpm、zip 等安装包。

相关文章:

cmake之旅(11)

cmake之旅(11) cmake之旅(11):交叉编译与工具链文件1 什么是交叉编译2 交叉编译的前提:安装交叉编译工具链3 工具链文件3.1 基本结构3.2 关键变量说明 4 使用工具链文件5 实战:为树莓派交叉编译…...

终极指南:如何快速免费恢复加密压缩包密码

终极指南:如何快速免费恢复加密压缩包密码 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 您是否曾经遇到过这种情况&#xff1…...

Motrix WebExtension快速上手:浏览器下载管理终极解决方案

Motrix WebExtension快速上手:浏览器下载管理终极解决方案 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager and its forks 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 还在为浏览器下载速…...

cmake之旅(12)

cmake之旅(12)cmake之旅(12):CPack 打包与发布1 CPack 是什么2 最简单的 CPack 配置3 配置 CPack3.1 基本信息3.2 选择打包格式4 生成 DEB 包5 生成 RPM 包6 完整示例7 组件化打包8 source 包9 本篇命令速查表10 总结与…...

D3KeyHelper:暗黑破坏神3玩家的终极智能助手,5分钟解放双手!

D3KeyHelper:暗黑破坏神3玩家的终极智能助手,5分钟解放双手! 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是…...

Qt定时器实战:5个QTimer高频使用场景代码示例(附避坑指南)

Qt定时器实战:5个QTimer高频使用场景代码示例(附避坑指南) 在Qt开发中,定时器是构建响应式、实时性应用的核心组件之一。无论是界面刷新、数据轮询还是事件防抖,QTimer都能以简洁的API解决复杂的时间控制问题。本文将聚…...

批处理脚本注释避坑指南:为什么你的rem语句有时不生效?

批处理脚本注释避坑指南:为什么你的rem语句有时不生效? 在Windows批处理脚本开发中,注释是代码可读性的重要保障。但许多开发者都遇到过这样的困惑:明明写了rem或::注释,运行时却出现意外错误或注释内容被当作命令执行…...

Illustrator脚本终极指南:5个核心脚本彻底改变你的设计工作流

Illustrator脚本终极指南:5个核心脚本彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts Adobe Illustrator是设计师的必备工具,但繁琐的…...

**Istio服务网格实战:基于Go语言的Sidecar注入与流量控制深度解析**在现代云原生架构中,**Istio** 已成为服务治理

Istio服务网格实战:基于Go语言的Sidecar注入与流量控制深度解析 在现代云原生架构中,Istio 已成为服务治理的核心组件之一。它通过 Sidecar 代理(Envoy)实现对微服务间通信的精细化控制,包括流量管理、安全策略、可观测…...

使用 Ace Data Cloud 的 Kling 视频生成 API 创建惊艳视频

简介 在数字内容创作日益普及的今天,视频已经成为了重要的传播媒介。Ace Data Cloud 提供的 Kling API 是一款强大的工具,可以帮助开发者和创作者轻松生成高质量的视频内容。无论是制作短片、广告视频,还是其他各种视觉作品,Klin…...

抖音批量下载终极指南:5分钟掌握无水印视频下载神器

抖音批量下载终极指南:5分钟掌握无水印视频下载神器 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

MusePublic生态扩展:与ControlNet兼容性验证及姿态控制实测

MusePublic生态扩展:与ControlNet兼容性验证及姿态控制实测 1. 项目背景与测试目标 MusePublic作为专为艺术人像创作设计的轻量化文本生成图像系统,已经在艺术感时尚人像生成方面展现出优异的表现。但在实际创作过程中,用户往往需要更精确的…...

Maccy:7个技巧让你成为macOS剪贴板管理大师,工作效率翻倍

Maccy:7个技巧让你成为macOS剪贴板管理大师,工作效率翻倍 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy 还在为找不到之前复制的内容而烦恼吗?想象一下&#x…...

Phi-4-mini-reasoning实战案例:从数学计算到商业分析,小白也能用的AI大脑

Phi-4-mini-reasoning实战案例:从数学计算到商业分析,小白也能用的AI大脑 1. 认识你的AI推理助手 1.1 什么是Phi-4-mini-reasoning Phi-4-mini-reasoning是一款专为推理任务优化的轻量级AI模型,它就像你随身携带的数学老师和商业顾问。这个…...

RevokeMsgPatcher:Windows平台微信/QQ/TIM防撤回补丁终极使用指南

RevokeMsgPatcher:Windows平台微信/QQ/TIM防撤回补丁终极使用指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https:/…...

QTableWidget 表格组件肇

7.1 初识三维模型 7.1.1 三维模型的数据载体 随着计算机图形技术的发展,我们或多或少都会见过或者听说过三维模型。笔者始终记得小时候第一次在电视上看到三维动画《变形金刚:超能勇士》的震撼感受;而现在我们已经可以在手机上玩三维游戏《王…...

30分钟搞定音频格式转换:silk-v3-decoder实战指南

30分钟搞定音频格式转换:silk-v3-decoder实战指南 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. 项目地…...

当Aurora IP遇上多板卡互联:灵活分配GT Quad与Lane的实战策略

Aurora IP在多板卡系统中的GT资源规划与实战技巧 在当今高速数据通信和雷达信号处理领域,多FPGA系统已成为主流架构。这类系统通常需要处理数十Gbps甚至上百Gbps的数据吞吐量,而Xilinx的Aurora协议配合GT高速串行收发器,为这种高带宽需求提供…...

从幻觉到失控,大模型对齐为何总在上线后崩盘?5个被99%团队忽略的工程断点

第一章:从幻觉到失控:大模型对齐崩盘的本质归因 2026奇点智能技术大会(https://ml-summit.org) 大模型的“对齐崩盘”并非偶然故障,而是多重目标函数在高维策略空间中发生结构性解耦的必然结果。当监督微调(SFT)与基于…...

【前端】【安全】【业务场景】设备指纹技术在前端安全登录中的应用实践

1. 设备指纹技术的前端安全价值 最近处理了一个电商平台的账号盗用案例,攻击者通过撞库获取用户凭证后,竟然能在不同设备上同时登录十几个账号。这让我意识到:单纯依赖账号密码的登录体系已经不够安全。而设备指纹技术就像给每台设备发了一张…...

Mem Reduct终极指南:一键解决Windows内存卡顿的完整教程

Mem Reduct终极指南:一键解决Windows内存卡顿的完整教程 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...

软件竞争管理中的差异化策略

在当今高度数字化的商业环境中,软件行业的竞争日益激烈。企业若想在市场中脱颖而出,差异化策略成为关键。通过独特的价值主张和创新的产品设计,软件公司能够有效区分自身与竞争对手,吸引目标用户并建立长期竞争优势。本文将探讨软…...

AMD Ryzen系统调试实战:3大高级策略解决硬件性能瓶颈

AMD Ryzen系统调试实战:3大高级策略解决硬件性能瓶颈 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…...

MediaCreationTool.bat:Windows系统部署的自动化解决方案

MediaCreationTool.bat:Windows系统部署的自动化解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat M…...

如何在2025年完美访问Flash内容:CefFlashBrowser完整使用指南

如何在2025年完美访问Flash内容:CefFlashBrowser完整使用指南 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还在为无法访问那些经典的Flash网站、教育课件和网页游戏而…...

Python的__init_subclass__设计扩展

Python作为一门灵活且功能强大的编程语言,其面向对象编程特性一直备受开发者青睐。其中,__init_subclass__是Python 3.6引入的一个特殊方法,它为类的继承机制提供了更强大的扩展能力。通过这个方法,开发者可以在子类被定义时自动执…...

从零搭建微信支付商户后台:Spring Boot + Maven实战入门

1. 从Android开发到后台系统的跨界之旅 作为一个常年和Android Studio打交道的移动端开发者,第一次接触微信支付商户后台开发时,那种手足无措的感觉我至今记忆犹新。公司项目突然需要接入支付功能,后台开发人手不足,这个任务就落在…...

基于Redis Sorted Set与前缀匹配的智能搜索组件实战

1. Redis Sorted Set为何适合智能搜索场景 Redis的Sorted Set(有序集合)是构建智能搜索组件的绝佳选择,这源于它独特的分数排序和范围查询能力。每个存储在Sorted Set中的元素都会关联一个分数(score),系统…...

Docker 目录编排规范

总体原则:docker/ 目录用于集中存放项目部署相关内容,成员进入后能快速找到启动方式、配置位置、脚本位置、构建产物位置。标准目录结构:docker/README.mddocker-compose.yml.env.example.env # 本地使用,不提…...

2026届必备的五大降AI率工具实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 把 AI 生成文本的痕迹予以降低,其关键的要点在于将那种机械的规整性给打破&…...