CMake 交叉编译

news2024/11/19 7:32:33

在这里插入图片描述
想知道“魔笛手”在这里能发挥什么作用吗?想象一下,把 CMake 当做法力高强的魔笛手,C++ 的项目则是故事中的那些被魔笛手拯救的孩子。

父母要抚养一个孩子并非易事,营养需要面面俱到,保证身体健康,关心事无巨细,确保快乐成长。其难度不亚于 C++ 项目的交叉编译,但一个保姆就能让事情变得更简单。类似地,我们也有 CMake 来简化交叉编译中的烦琐事。

交叉编译到底是什么?

以一个著名的应用程序为例,比如 Microsoft Paint。在它成为可执行文件之前,是一组源代码文件。编译源代码并将目标代码链接到单个可执行文件,这是编译器的工作。在正常情况下:

在这里插入图片描述
Microsoft Paint 的源代码是一组C++文件,在 Microsoft windows 中使用 Visual Studio 编译器进行编译。现在来看交叉编译场景:

在这里插入图片描述
因此,当源代码编译器对应的操作系统与其当前所在的操作系统不同时,就会发生交叉编译。这张图应该更清楚一点:

在这里插入图片描述
现在,交叉编译这个术语从何而来已经很明显了。跨平台软件开发并不容易,因为每个操作系统都有自己的特点。为 Windows 编写的源代码通常不能为 Linux 编译,反之亦然。这就是 Qt 等框架和 POSIX 等标准发挥作用的地方。

我不能忍受简单编译吗?

不总是这样。举个例子,一个开发者正在为 Android 开发的应用程序,他会利用开发机器(Windows、Linux 或 Mac)的计算能力为 Android 交叉编译应用程序。如果开发人员将目标锁定为 Raspberry Pi 这样的平台,情况也是如此。比起要在一台低性能机器上耗费大量时间运行编译,在功能强大的开发机器上设置交叉编译环境并将二进制文件复制到 Raspberry Pi,则容易得多。
交叉编译的另一个用例,是使用目标机器的本机编译器生成依赖项的复杂性。例如,以 Chromium(Microsoft Edge 浏览器和 Google Chrome 浏览器的基础)这样一个在多个平台上都受支持的开源项目为例。由于存在多个依赖项,因此不建议尝试以本机方式构建 Chromium。更确切地说,本地镜像是一个 Linux 容器,承载 GNU GCC 来交叉编译源代码。

能举个交叉编译的例子吗?

Windows 10 桌面操作系统有两种不同的风格:

  • Windows 10, Intel CPUs ( 32 Bit 和 64 Bit 版本)
  • Windows 10,ARM CPUs (ARM32 和ARM64 Bit 版本)

为 Intel CPU 编译的程序与 ARM CPU 不兼容,反之亦然。Microsoft Visual Studio 附带以下命令工具,其中一些用于交叉编译:

  • VS2015 x64 ARM Cross Tools Command
  • VS2015 x64 Native Tools Command
  • VS2015 x64 x86 Cross Tools Command
  • VS2015 x86 ARM Cross Tools Command
  • VS2015 x86 Native Tools Command
  • VS2015 x86 x64 Cross Tools Command

我们对交叉编译工具很感兴趣。让我们试着创建一个简单的 “Hello, World!” C++ 程序:

#include int main(int argc, char** argv){std::cout << “Hello, World!” << std::endl;return 0;}

在 x64 本机命令行上,编译上述程序:

在这里插入图片描述
在 x64 ARM cross tools 命令提示符下,编译相同的程序:

在这里插入图片描述
特别注意 /machine:arm 输出。编译成功并生成了可执行文件,但从运行可执行文件可以看出,它不适用于当前计算机:

在这里插入图片描述
恭喜!你已经在不同的机器上成功交叉编译了最简单 C++ 程序。

为什么需要交叉编译?

为同一操作系统支持的不同 CPU 进行编译是交叉编译的最简单形式。如果你想使用 Linux 并希望生成支持 Windows 的可执行文件,该怎么办?如果可能的话,最好使用相同的代码库来生成 Linux 和 Windows 可执行文件。

我们来试一下。我有一个 Windows 10 的机器,运行了一个适用于 Linux 的Windows 子系统,并且在这个系统上安装了 Ubuntu。简单输入:

sudo apt-get install mingw-w64

将为 Windows 安装 mingw 交叉编译器工具链。我们创建 CMakeLists.txt 文件:

#set minimum cmake versioncmake_minimum_required(VERSION 3.5 FATAL_ERROR)

#project name and languageproject(HelloWorld LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_EXTENSIONS OFF)set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(GNUInstallDirs)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
C M A K E B I N A R Y D I R / {CMAKE_BINARY_DIR}/ CMAKEBINARYDIR/{CMAKE_INSTALL_LIBDIR})set(CMAKE_LIBRARY_OUTPUT_DIRECTORY C M A K E B I N A R Y D I R / {CMAKE_BINARY_DIR}/ CMAKEBINARYDIR/{CMAKE_INSTALL_LIBDIR})set(CMAKE_RUNTIME_OUTPUT_DIRECTORY C M A K E B I N A R Y D I R / {CMAKE_BINARY_DIR}/ CMAKEBINARYDIR/{CMAKE_INSTALL_BINDIR})

#define executable and its source fileadd_executable(HelloWorld main.cpp)

为CMake创建一个工具链文件,它告诉我们一些关于交叉编译工具链的信息。像这样:

#the name of the target operating systemset(CMAKE_SYSTEM_NAME Windows)

#which compilers to useset(CMAKE_C_COMPILER i686-w64-mingw32-gcc)set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)

#adjust the default behavior of the find commands:# search headers and libraries in the target environmentset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

#search programs in the host environmentset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

将此文件另存为 cross-compilation.cmake,并将其保存在 CMakeLists.txt 文件(见上文)和 Main.cpp. 创建一个名为“build”的新文件夹并更改到该目录。现在发出命令:

cmake … -DCMAKE_TOOLCHAIN_FILE=…/cross-compilation.cmakecmake –build .

这将会创建一个 HelloWorld.exe,就像 build/bin 文件夹中的 CMakeLists.txt 中指定的那样。我们取得了什么成就?我们为 Windows 创建了一个完全在 Linux 下运行的可执行文件。不同的工具链文件和编译器应允许相同的 CMakeLists.txt 文件为多个平台创建的目标。

使用 CMake 进行跨平台软件开发

CMake 是一个很好的跨平台软件开发工具。它使用一组称为工具链的实用程序来驱动构建。在构建中使用 CMake 有两种主要场景:

  • CMake 负责选择工具链的普通构建
  • 用户指定工具链文件的跨平台构建

上面的简单示例演示了如何创建工具链文件,并通知 CMake 使用该工具链文件来驱动构建。在实际的跨平台软件开发中,相关工作人员会仔细选择有助于这种开发的框架,例如 Qt。
另外,如果你想了解更多关于 CMake 的信息,请阅读我们的博客 CMake vs Make。

结论

魔笛手的故事有一个圆满的结局吗?一些版本说魔笛手把孩子们带到了一个美丽的地方。CMake 作为跨平台软件开发的一个选择,也应该带来这样一个美好的结局。

点击了解 Incredibuild 加速 C/C++ 构建编译的解决方案,并获取试用 License!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【活动】探索人工智能的“迷惑瞬间”:真实体验与技术挑战

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 标题&#xff1a;探索人工智能的“迷惑瞬间”&#xff1a;真实体验与技术挑战引言…

vulhub中Weblogic 管理控制台未授权远程命令执行漏洞复现(CVE-2020-14882,CVE-2020-14883)

Weblogic是Oracle公司推出的J2EE应用服务器。在2020年10月的更新中&#xff0c;Oracle官方修复了两个长亭科技安全研究员voidfyoo 提交的安全漏洞&#xff0c;分别是CVE-2020-14882和CVE-2020-14883。 CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台&#x…

英飞凌电源管理PMIC的安全应用

摘要 本篇文档主要用来介绍英飞凌电源管理芯片TLF35584的使用&#xff0c;基于电动助力转向应用来介绍。包含一些安全机制的执行。 TLF35584介绍 TLF35584是英飞凌推出的针对车辆安全应用的电源管理芯片&#xff0c;符合ASIL D安全等级要求&#xff0c;具有高效多电源输出通道&…

[综述笔记]Graph Neural Networks in Network Neuroscience

论文网址&#xff1a;Graph Neural Networks in Network Neuroscience | IEEE Journals & Magazine | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xf…

阿里云服务器2核4G配置2024年活动价格及收费标准价格表

阿里云服务器2核4G配置2024年需要多少钱&#xff1f;2核4G配置的阿里云服务器选择不同实例规格和地域&#xff0c;其收费标准和活动价格都是不一样的&#xff0c;2024年3月1日&#xff0c;阿里云率先宣布云产品大规模调价&#xff0c;其中云服务器最高降幅达36%&#xff0c;因此…

计算机网络:网络层知识点汇总

文章目录 一、网络功能概述二、SDN基本概念三、路由算法与路由协议概述四、IP数据报格式五、IP数据报分片六、IPv4地址七、网络地址转换NAT八、子网划分和子网掩码九、无分类编址CIDR十、ARP协议十一、DHCP协议十二、ICMP协议十三、IPv6十四、RIP协议与距离向量算法十五、OSPF协…

qt-C++笔记之使用Cmake来组织和构建QWidget工程项目

qt-C笔记之使用Cmake来组织和构建QWidget工程项目 —— 杭州 2024-03-10 code review! 文章目录 qt-C笔记之使用Cmake来组织和构建QWidget工程项目1.运行2.文件结构3.CMakeLists.txt4.main.cpp5.widget.h6.widget.cpp7.widget.ui 1.运行 2.文件结构 3.CMakeLists.txt 代码 c…

Qt 数据库驱动未装载MYSQL

一、第一部分 0.Qt 连接mysql数据库时报错&#xff1a; QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 QT连接代码&#xff1a; bool createMysqlConn() {QSqlDatabase sqldb QSqlDatabase::addDatabase(&qu…

【算法面试题】-05

智能成绩表 class Student:def __init__(self):self.name "" # 学生名字self.scores [] # 每门课成绩students [Student() for _ in range(10004)] # 存储学生信息的数组 key_index 0 # 要排序的课程名的下标# 自定义排序函数 def student_comparator(a, b):…

中间件 | Redis - [基本信息]

INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法&#xff0c;需要注意分布式锁的redis需要单点 分布式事务 分布式事务中&#xff0c;核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC&#xff0c;比如 seata 的 AT 模式下&#xff0c;将 un…

低功耗控制器结合Node-RED革新电力系统监控方式

现代电力行业的不断发展与技术进步&#xff0c;微电网ARM低功耗控制器与Node-RED的深度融合&#xff0c;为电力系统的智能化运维提供了崭新的解决方案。这一集成方案将硬件控制的高效稳定与软件逻辑处理的强大灵活性相结合&#xff0c;实现了对变电站设备、输电线路状态以及智能…

Importing ArkTS files to JS and TS files is not allowed. <etsLint> 解决方法

这个问题是 harmonyos 项目中 因为在ts中导入了 ets文件造成的 系统不需要在ts文件中 直接导入 ets文件 一般来讲 ts能写的代码 ets也可以 最简单的方式 就是直接将 ts 改为ets 右键文件 如下图选择 将后缀的ts改为 ets 就OK了

GEE:计算一个遥感影像的空像素占比

作者:CSDN @ _养乐多_ 本文将介绍,如何在 Google Earth Engine (GEE) 平台计算一个遥感影像的空像素占比,其中,包含获取研究区内所有像素的总数的代码,以及获取非空像素的总数的代码。 结果如下图所示, 文章目录 一、核心函数1.1 获取研究区内所有像素的总数1.2 获取非…

LeetCode刷题日志-46.全排列

跟77题组合一样&#xff0c;在这里又遇到同样的问题&#xff0c;如果使用暴力解法&#xff0c;nums大小不同&#xff0c;使用的循环嵌套的层数也不同。那么这时候我们就需要使用暴力的解法。 我们看以下代码&#xff0c;如果nums [1,2,3]会输出什么&#xff1f; class Soluti…

openssl3.2 - 官方demo学习 - encode - ec_encode.c

文章目录 openssl3.2 - 官方demo学习 - encode - ec_encode.c概述笔记产生ecc私钥产生ecc公钥测试工程END openssl3.2 - 官方demo学习 - encode - ec_encode.c 概述 官方demos/encode 目录中给了2个例子工程 功能是载入(RSA/ECC)公钥, 然后自己就可以拿内存中的公钥对象干活了…

Uber/Google Golang编码标准深度分析

良好的代码风格对于开发优秀的产品至关重要&#xff0c;本文通过分析比较三部流传甚广的Golang代码风格指南&#xff0c;介绍了Go代码风格要点&#xff0c;并介绍了通过工具实现代码检查的方式。原文: Mastering Go: In-Depth Analysis of Uber and Google’s Coding Standards…

算法50:动态规划专练(力扣514题:自由之路-----4种写法)

题目: 力扣514 &#xff1a; 自由之路 . - 力扣&#xff08;LeetCode&#xff09; 题目的详细描述&#xff0c;直接打开力扣看就是了&#xff0c;下面说一下我对题目的理解: 事例1&#xff1a; 输入: ring "godding", key "gd" 输出: 4. 1. ring的第…

【网络原理】TCP 协议中比较重要的一些特性(一)

目录 1、TCP 协议 2、确认应答 2.1、确认序号 3、超时重传 4、连接管理 4.1、建立连接&#xff08;三次握手&#xff09; 4.2、断开连接&#xff08;四次挥手&#xff09; 1、TCP 协议 TCP 是工作中最常用到的协议&#xff0c;也是面试中最常考的协议&#xff0c;具有面…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

关于yolov8的DFL模块(pytorch以及tensorrt)

可以参考我改的项目&#xff0c;不过目前推理结果不对&#xff0c;还在修复&#xff1a; https://github.com/lindsayshuo/yolov8-cls-tensorrtx先看代码 class DFL(nn.Module):"""Integral module of Distribution Focal Loss (DFL).Proposed in Generalized…