CMake 交叉编译

在这里插入图片描述
想知道“魔笛手”在这里能发挥什么作用吗?想象一下,把 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!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【周总结周末日常】

周总结 完成任务开发并且与前端联调通过 完成已开发功能的冒烟测试 修复测试中出现的一些数据显示问题 2024/3/10 晴 温度适宜 这周天气比上周好多了&#xff0c;最起码见到好几次太阳 周六在世纪公园溜达一会儿&#xff0c;偶尔呼吸下大自然&#xff0c;挺棒的…

wpscan专门针对wordpress的安全扫描工具

说明 WPScan是一款专门针对WordPress的漏洞扫描工具&#xff0c;它使用Ruby编程语言编写。WPScan能够扫描WordPress网站中的多种安全漏洞&#xff0c;包括WordPress本身的漏洞、插件漏洞和主题漏洞。此外&#xff0c;WPScan还能扫描类似robots.txt这样的敏感文件&#xff0c;并…

Clion attach一个linux进程进行debug

背景 手头的一段程序&#xff0c;目前已经在linux上运行了&#xff0c;我在windows上有源代码&#xff0c;想在本地debug一下&#xff0c;看看代码里复杂的流程都是怎么样运行的。 代码样例 # fileName:calculateSum.cpp #include <iostream>int main() {int num1, nu…

C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函…

FX110网:在CP Markets申请出金四个多月了,没任何消息!

近期&#xff0c;本站收到一中国汇友投诉&#xff0c;称其CP Markets平台已数月无法出金&#xff0c;平台方也没有任何回应。在货币市场闯荡久了的“老鸟”就会知道&#xff0c;平台无故不给出金必定有妖&#xff0c;更何况还是长达数月&#xff01; 在CP Markets申请出金四个多…

LINE社群:为您的跨境出海业务带来更多流量

LINE 社群就是一个大型的公开聊天室&#xff0c;通过LINE社群不需要将对方添加为好友就可以聊天。它主要是以「兴趣」作为区分&#xff0c;所以商家可以在社群中找到不少潜在客户。尤其是面向台湾、日本、泰国这些地区的商家&#xff0c;LINE在这些地区的普及度很高&#xff0c…

10000的单子谈崩了,坚持用beego什么骚操作?

今天有个客户询盘&#xff0c;想仿制一个旅游的网站&#xff0c;一句话差点让我当场拒绝&#xff1a;前端都是静态的&#xff0c;网上有很多工具可以下载源代码&#xff0c;后端接入支付&#xff0c;做个简单的统计&#xff0c;客服&#xff0c;再接入google地图就行了...... 简…

【JAVA重要知识 | 第六篇】Java集合类使用总结(List、Set、Map接口及常见实现类)以及常见面试题

文章目录 6.Java集合类使用总结6.1概览6.1.1集合接口类特性6.1.2List接口和Set接口的区别6.1.3简要介绍&#xff08;1&#xff09;List接口&#xff08;2&#xff09;Set接口&#xff08;3&#xff09;Map接口 6.2Collection接口6.3List接口6.3.1ArrayList6.3.2LinkedList—不常…

PyCharm无代码提示解决

PyCharm无代码提示解决方法 在使用PyCharm工具时&#xff0c;调用方法却无法进行提示&#xff0c;针对PyCharm无代码提示整理下解决方案 1、Python内置语法无智能提示 复现&#xff1a;我这里以urllib库读取网页内容为例&#xff0c;在通过urlopen(&#xff09;之后调用getur…

Python打包为可执行文件

一文带你搞定python脚本(.py)打包为可执行文件(.exe) 文章目录 一文带你搞定python脚本(.py)打包为可执行文件(.exe)01、为什么要打包Python脚本&#xff1f;02、打包步骤&#xff1f;第一步&#xff1a;环境配置与操作包安装第二步&#xff1a;开始打包第三步&#xff1a;输入…

汽车行业一项网络安全标准实践指南发布,SSL证书助力传输通道加密,确保数据安全

2024年3月7日&#xff0c;全国网络安全标准化技术委员会秘书处发布了《网络安全标准实践指南——车外画面局部轮廓化处理效果验证》&#xff08;以下简称《实践指南》&#xff09;&#xff0c;旨在指导汽车数据处理者对车外画面进行人脸、车牌局部轮廓化处理效果的自行验证。《…

图的链式前向星存储与搜索

图的存储与搜索 链式前向星存储 图的存储方式有很多种&#xff0c;但是也都有各自的优缺点。例如&#xff1a;采用邻接矩阵的形式存储的时候&#xff0c;存储比较简单&#xff0c;但是遍历或者处理的时候就会比较浪费时间&#xff1b;而采用邻接表存储&#xff0c;则效率会有…

无需修改配置springboot启动多个不同端口的启动类

idea:2023 1.4版本 复制原先启动类&#xff0c;原先没有启动类&#xff0c;点击上方➕添加启动类 需要配置不同的端口号&#xff0c;其他默认 点击应用即可

ARM地址映射表

硬件控制原理 只有Load/start指令可以读写硬件控制器量的寄存器&#xff0c;从而操作硬件地址划分图如下(其中IO(SFR)用来操控硬件的)&#xff1a;注意&#xff1a;对于一个32位的处理器&#xff0c;里面的所有寄存器都是32位地址&#xff0c;所以范围位2的32次方&#xff0c;…

Tab组件的编写与动态日期的函数封装

src\components\Tab\Icon.vue 底部导航栏子组件。 <template><router-link :to"path" class"tab-icon"><i class"icon">{{iconText}}</i><p class"text"><slot>{{ tabText }}</slot></…

ModuleNotFoundError: No module named ‘sklearn.cross_validation‘

一、问题分析 ModuleNotFoundError: No module named sklearn.cross_validation 英文先翻译一遍&#xff0c;模块未找到问题&#xff0c;这里涉及到sklearn这个模块&#xff0c;Sklearn &#xff08;全称 SciKit-Learn&#xff09;&#xff0c;是基于 Python 语言的机器学习工…

【玩转Linux】有关Linux权限

目录 一.Linux权限的概念 1. 权限的本质 2.Linux中的用户 3.Linux中的权限管理 (1)文件访问者的分类 (2)文件类型和访问权限&#xff08;事物属性&#xff09; ①文件基本权限 ②文件权限值的表示方法 (3)文件访问权限的相关设置方法 ① 用 户 表 示 符 / - 权 …

Android14音频进阶:AudioTrack如何巧妙衔接AudioFlinger(五十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

GAN 网络的损失函数介绍代码

文章目录 GAN的损失函数介绍1.L1 losses2.mse loss3.smooth L14.charbonnier_loss5.perceptual loss (content and style losses)6.Gan损失7.WeightedTVLoss8.完整代码方便使用,含训练epoch代码。 GAN的损失函数介绍 1.L1 losses pixel_opt: type: L1Loss loss_weight: 1.0 r…

如何将视频内容转换为文字文稿?这三款工具助您实现视频转写!

在日常生活中&#xff0c;有时我们需要将视频中的内容转换为文字文稿以便于搜索、编辑或分享。但选择合适的视频转文字软件可能让人感到困惑。今天我将为您推荐三款优秀的视频转文字工具&#xff0c;它们操作简单、准确高效&#xff0c;能够帮助您快速完成视频内容转写的工作。…