ARM交叉编译

目录

一、介绍

1、本地编译

2、交叉编译

二、交叉工具链

1、概念

2、工具

3、获取方法

三、交叉编译运行程序

1、pc机操作(x86_64)

​2、开发板操作(ARM)


一、介绍

1、本地编译

        本地编译是在与目标运行环境相同的机器上进行的编译过程,也就是说,编译器和生成的可执行文件在同一个平台上运行

  • 相同平台:编译和运行代码的平台相同。
  • 简单性:配置和依赖关系比较简单,因为编译环境和运行环境是一致的。
  • 调试方便:可以直接在本机器上调试生成的可执行文件。

2、交叉编译

        交叉编译是在与目标运行环境下不同的机器上进行的编译过程。编译器生成的可执行文件是为另一种平台设计的

  • 不同平台:编译器所在的平台与目标运行平台不同。
  • 复杂性:配置和依赖关系更复杂,因为需要设置交叉编译工具链和目标平台的库和头文件。
  • 调试不便:生成的可执行文件不能在本地机器上运行,调试需要在目标平台上进行。

        简单地说,编译生成的可执行程序可直接在本机运行的叫本地编译。而在一个平台上编译出能在另一种体系结构完全不同的处理器上运行的程序叫交叉编译

        为什么要有交叉编译器呢?简单来说,就是嵌入式系统中的资源太少。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,支持本地编译。

二、交叉工具链

1、概念

         在嵌入式开发过程中有宿主机目标机的角色之分:宿主机是执行编译链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。

        在宿主机执行编译的流程如下:

         交叉工具链指的是将程序代码,编译成可执行文件的一系列工具,按照先编译后链接等相关的编译程序的内在逻辑串起来。交叉工具链主要由binutils、gcc和glibc组成。

        为了将程序代码,编译成可执行文件,涉及到编译,链接(等其他步骤),要依赖到很多相关的工具,最核心的是编译器gcc,链接器ld。

  • 编译:将程序代码生成目标平台的目标文件。
  • 链接:将多个目标文件和库文件链接在一起,生成可执行文件或库文件。

        其中,链接器ld只是处理操作目标文件,二进制文件的最主要的一个工具,而和操作目标等文件相关的,还有其他很多工具的:as,objcopy,strip,ar等等工具的。GNU官网弄出了一个二进制工具包,集成了这些和操作二进制相关的工具集合,叫做binutils。

        一句话概括就是自己平台上用于交叉编译的一系列工具就叫做交叉工具链。由于其中最最主要的是用于编译的gcc,所以,我们也常把:交叉工具链,简称为交叉编译器。即:严格意义上来说,交叉编译器,只是指的是交叉编译版本的gcc。但是实际上为了叫法上的方便,我们常说的交叉编译器,都是指的是交叉工具链。即,常说的交叉编译版本的gcc,比如arm-linux-gcc,实际上指代了,包含一系列交叉编译版本的交叉工具链(arm-linux-gcc,arm-linux-ld,arm-linux-as等等)。

2、工具

工具名工具说明
gccc程序源码编译工具
g++c++程序源码编译工具
cppc程序预处理器
as将汇编源码汇编成目标机器代码.o文件
ar将多个可重定位的.o文件归档为一个静态库.a文件
ranlib产生归档.a文件索引,并将其保存到这个归档文件中,因为ar命令支持该特性,所以现在很少用了
ld链接器,用来将多个目标文件.o、静态库.a文件、动态库.so文件链接生成一个可执行文件
readelf列出ELF格式可执行文件的相关信息
nm列出目标文件中的函数符号表
size列出目标文件中每个段(text、data、bss等)的大小
strings列出目标文件中能打印出来的字符串
strip去掉目标文件中一些无关调试信息等,减小文件的大小
objcopy把一种目标文件中的内容复制到另一种目标文件中,裸机开发经常会用这个命令将ELF格式的文件转换成二进制文件
objdump该工具常用于对二进制进行反汇编,默认输出到标准输出,所以一般配合重定向一起使用
addr2line将程序地址转换为文件名、函数名和源代码行号,主要用来调试或反汇编

3、获取方法

        获取交叉编译器一般有两种方式,一种是直接从官网上进行下载,或者购买开发板的时候厂家会提供你对应的交叉编译器;另一种就是自己制作交叉编译器,如果我们从零开始做一个交叉编译器难度是很大的,所以正常情况下我们都是借助工具来制作交叉编译器,推荐使用crosstool-NG和buildroot(不仅能制作交叉工具链,而且还可以制作根文件系统rootfs。而且还支持同时编译对应的Linux内核和Uboot)。

三、交叉编译运行程序

1、pc机操作(x86_64)

(1)在.bashrc中设置交叉编译路径

(2)编写程序并编译

 (3)将执行文件上传至本地文件中

 2、开发板操作(ARM)

(1)我的板子不支持scp传输命令,所以我这里采用的tftp命令(我这里用了tftp32软件,下载资源下面给大家了,可以免费下载)。

 (2)连接开发板,下载运行文件

           通过一个简单的hello程序,为大家整理了交叉编译的流程。由于每个人的开发板不同,所以设置可能略有不同,但是原理都是一样的,大家哪里遇到问题可以私信问我。

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

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

相关文章

大模型训练的艺术:从预训练到增强学习的四阶段之旅

文章目录 大模型训练的艺术:从预训练到增强学习的四阶段之旅1. 预训练阶段(Pretraining)2. 监督微调阶段(Supervised Finetuning, SFT)3. 奖励模型训练阶段(Reward Modeling)4. 增强学习微调阶段…

FreeRTOS消息队列

消息队列简介 队列是为了任务与任务、 任务与中断之间的通信而准备的, 可以在任务与任务、 任务与中断之间传递消息, 队列中可以存储有限的、 大小固定的数据项目。任务与任务、 任务与中断之间要交流的数据保存在队列中, 叫做队列项目。 队…

【博士每天一篇文献-综述】Modularity in Deep Learning A Survey

阅读时间:2023-12-8 1 介绍 年份:2023 作者:孙浩哲,布朗克斯医疗卫生系统 会议: Science and Information Conference 引用量:4 论文主要探讨了深度学习中的模块化(modularity)概念…

ROS学习记录:C++节点发布自定义地图

前言 ROS栅格地图格式 在了解了ROS地图消息包的数据结构后(链接在上),本文将编写一个节点,发布地图消息包,看看在RViz中显示是什么效果。 一、准备 1、为了简单起见,发布一个两行四列的地图 2、为了便于观测,只对地…

沐风老师3DMAX一键多孔结构建模插件Porous使用方法

​3DMAX一键多孔结构建模插件Porous使用教程 3dMax是大家熟知的3D建模软件之一,其功能非常的强大,在科研绘图领域有着非常广泛的应用,但是由于科研绘图的图形(模型)一般都属于异形结构,手工绘制建模&#x…

Seq2seq、编码器解码器神经网络

目录 一、Seq2seq 简介二、编码器三、解码器四、编码器-解码器的训练 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 需掌握的前提知识: LSTM、词嵌入 本文参考:【官方双语】编码、解码神经网…

人类记忆优化算法:针对全局优化问题的记忆启发优化器

Human memory optimization algorithm: A memory-inspired optimizer for global optimization problems 24年 Expert Systems With Applications sci一区 原文链接: https://doi.org/10.1016/j.eswa.2023.121597 Zhu D, Wang S, Zhou C, et al. Human memory optimization alg…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

🚀时空传送门 🔍引言📕GPT-4概述🌹机器学习在GPT-4中的应用🚆文本生成与摘要🎈文献综述与知识图谱构建🚲情感分析与文本分类🚀搜索引擎优化💴智能客服与虚拟助手&#x1…

Web--CSS基础

文章目录 定义方式选择器文本字体背景边框元素展示格式内边距与外边距盒子模型位置浮动flex布局响应式布局 定义方式 行内样式表 直接定义在style属性中&#xff0c;作用于当前标签 <img src "/imges/logo.jpg" alt "" style "width 400"…

时钟影响ADC性能不仅仅是抖动

时钟影响ADC性能除了抖动&#xff0c;还有占空比。 在高速AD采样中&#xff0c;时钟占空比是非常重要的一个参数。时钟信号的上升沿控制ADC的采样&#xff0c;而下降沿控制着信号的保持&#xff0c;在一个周期内才可以完成量化输出&#xff0c;所以必须保持时钟的占空比为50%&…

自动化决策和业务流程类控制的系统前端UI设计开发

自动化决策和业务流程类控制的系统前端UI设计开发

NLP——电影评论情感分析

python-tensorflow2.0 numpy 1.19.1 tensorflow 2.0.0 导入库 数据加载 数据处理 构建模型 训练 评估 预测 1.基于2层dropout神经网络 2.基于LSTM的网络 #导入需要用到的库 import os import tarfile import urllib. request import tensorflow as tf import numpy a…

使用Python批量处理Excel的内容

正文共&#xff1a;1500 字 10 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在前面的文章中&#xff08;如何使用Python提取Excel中固定单元格的内容&#xff09;&#xff0c;我们介绍了如何安装Python环境和PyCharm工具&#xff0c;还利用搭好的环境简单测试了一下ChatGPT提…

小程序名片怎么生成?AI名片生成器源码系统 为企业店铺创建自己的数字名片

在数字化时代&#xff0c;小程序名片已经成为企业店铺展示自身形象、推广产品和服务的重要工具。分享一个AI名片生成器源码系统春哥AI雷达智能名片小程序系统企业商业运营版&#xff0c;含完整代码包和详细的图文安装部署搭建教程&#xff0c;新手也能轻松使用&#xff0c;源码…

MySQL: 索引与事务

文章目录 1. 索引 (Index)1.1 概念1.2 作用1.3 使用场景1.4 索引的使用1.5 索引的使用案例 (不要轻易尝试)1.6 索引背后的数据结构1.7 重点总结 2.事务2.1 为什么要使用事务2.2 事务的概念2.3 事务的使用2.4 对事务的理解2.5 事务的基本特性 1. 索引 (Index) 1.1 概念 索引是…

Python Requests库详解

大家好&#xff0c;在现代网络开发中&#xff0c;与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言&#xff0c;提供了各种工具和库来简化这一过程。其中&#xff0c;Requests库作为Python中最受欢迎的HTTP库之一&#xff0c;为开发人员提供了简单而…

12-Gateway网关-网关作用介绍

12-Gateway网关-网关作用介绍 1.为什么需要网关&#xff1a; 网关功能&#xff1a; ​ 1.身份认证和权限校验 ​ 2.服务路由、负载均衡 ​ 3.请求限流 2.网关的技术实现&#xff1a; 在SpringCloud中网关的实现包括两种“ ​ gateway ​ zuul Zuul是基于Servlet的实…

node-mysql的批量插入

此前我批量插入都是用类似这样的命令&#xff1a; sqlcmdinsert into table(field1,field2,...) values ? indata[["f1v1","f2v1"],["f1v2","f2v2"],...] mysqlconn.query(sqlcmd,[indata],(err,res)>{...})但是感觉不太舒服&…

VueRouter3学习笔记

文章目录 1&#xff0c;入门案例2&#xff0c;一些细节高亮效果非当前路由会被销毁 3&#xff0c;嵌套路由4&#xff0c; 传递查询参数5&#xff0c;命名路由6&#xff0c;传递路径参数7&#xff0c;路径参数转props8&#xff0c;查询参数转props9&#xff0c;replace模式10&am…

Vue--》从零开始打造交互体验一流的电商平台(二)

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…