交叉编译知识解析(一) —— 交叉编译和交叉工具链
一、交叉编译简介
1、什么是交叉编译
1.1 本地编译
解释什么是交叉编译之前,先要明白一个概念:本地编译
我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的程序(或者库文件),其可以直接在当前的环境,即x86的CPU下,当前电脑中,运行。
此时的编译,可以叫做,本地编译,即在当前目标平台下,编译出来的程序,也只是放到当前平台下,就可以运行的。
2.2 交叉编译
交叉编译,是一个和,本地编译,相对应的概念。
而所谓的,交叉编译,就是:在一种平台上编译,编译出来的程序,是放到别的平台上运行即编译的环境,和运行的环境不一样,属于交叉的,此所谓cross。
交叉编译,这个概念,主要和嵌入式开发有关。
例 1.1. 在x86平台上编译,在ARM平台上运行 一种最常见的例子就是: 在进行嵌入式开发时 手上有个嵌入式开发板,CPU是arm的 然后在x86的平台下开发,比如Ubuntu的Linux,或者是Win7 然后就需要: 在x86的平台上,(用交叉编译器)去编译你写好的程序代码 编译生成的(可执行的)程序,是放到目标开发板,arm的CPU上运行的 此所谓:在x86平台上编译,在ARM平台上运行
交叉编译,英文常写作cross compile,也有其他写法:crosscompile, cross compiling等
2、为何要有交叉编译
之所以要有交叉编译,主要原因是:嵌入式系统中的资源太少
具体的解释就是:交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译
最常见的情况是:在进行嵌入式开发时,目标平台,即嵌入式开发板,比如是最大主频200MHz的ARM的CPU,加上32M的RAM,加上1G的Nand Flash等等。在如此相对比较紧张的硬件资源的前提下,在已经运行了嵌入式Linux的前提下,是没法很方便的直接在嵌入式Linux下,去本地编译,去在ARM的CPU下,编译出来,供ARM的CPU可以运行的程序的。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。
BusyBox中包含make等和编译开发相关的工具 对应的,等你后期熟悉了嵌入式开发,熟悉了Busybox后, 比如在Buildroot中去配置Busybox,或者单独交叉编译BusyBox时: 【记录】Ubuntu下为QEMU的arm平台交叉编译BusyBox 就会看到,后来的BusyBox,功能增加后,也已经包含了一些,和编译开发相关的工具,比如make等等 而这些工具,本来的话,只是,放在PC端使用,即在x86平台下做开发的时候,在交叉编译的时候,才用到的工具, 现在,也在(BusyBox的)嵌入式环境中,支持了。 此时,如果,你在BusyBox中把相关的开发工具都选上的话, 再加上,你的目标开发板的硬件配置足够强大的话,比如CPU都是以GHz为单位,等等 加上相关的开发的库和工具都很全的话 实际上,至少理论上,也是可以在你的嵌入式Linux中,进行,有限的,甚至是很大程度上的,本地开发 即,直接在ARM的开发板上,嵌入式Linux中,直接进行嵌入式开发,进行针对ARM的本地编译 比如,编译出一个helloworld,估计还是可以的 这样,就不存在,或者说,避免了,此处所说的,交叉编译,而变成了本地编译 就相当于,之前在x86的PC端的,编译程序放在x86的CPU上运行的本地编译, 在ARM的CPU,嵌入式Linux中,也实现了 但是很明显,对于更加复杂的程序或者库,在ARM开发板上直接编译的可行性和效率,相对就很低 而且如果是本身折腾Uboot等东西,本身目标运行环境,就没有完整的(嵌入式Linux)系统的话,那么就更加没法在目标平台实现本地编译了。 则还是只能进行,此处所说的,交叉编译
二、交叉工具链简介
1、什么是工具链
所谓的工具链,两部分的含义:
a -- 工具
工具,即tool
工具,是用来干活的;此处要干的活,目标是为了:生成(可以运行的)程序或库文件
而为了达成此目标,内部的执行过程和逻辑主要包含了:
1)、编译
编译的输入(对象)是:程序代码
编译输出(目标)是:目标文件
编译所需要的工具是:编译器
编译器,常见的编译器,即为gcc
2)、链接
链接的输入(对象)是:(程序运行时所依赖的,或者某个库所依赖的另外一个)库(文件)
链接的输出(目标)是:程序的可执行文件,或者是可以被别人调用的完整的库文件
链接所需要的工具是:链接器
链接器,即ld
即,此处,为了将程序代码,编译成可执行文件,涉及到编译,链接(等其他步骤),要依赖到很多相关的工具,最核心的是编译器gcc,链接器ld。而此处,所谓的工具,主要指的就是:和程序编译链接等相关的gcc,ld等工具
binutils包含了ld等工具 实际上,上面所说的ld,只是处理操作目标文件,二进制文件的最主要的一个工具 而和操作目标等文件相关的,还有其他很多工具的:as,objcopy,strip,ar等等工具的 所以,对此,GNU官网,弄出一个binutils,即binary utils,二进制工具(包),集成了这些,和操作二进制相关的工具集合,叫做binutils 所以,之后你所见到的,常见的工具,就是那个著名的GNU Binutils了。
b -- 链
链,即链条,chain
之所以能称为链,你是说明不止一个东西,然后,按照对应的逻辑,串在一起,链在一起。而对应的,涉及到的:
不止一个东西:指的是就是前面所说的那个工具,即:和程序编译链接等相关的gcc,binutils等工具
按照对应的逻辑:指的就是,按照程序本身编译链接的先后顺序,即:先编译,后链接,再进行后期其他的处理等等,比如用objcopy去操作相应的目标文件等等。
如此的,将:
和程序编译链接等相关的gcc,binutils等工具按照先编译后链接等相关的编译程序的内在逻辑串起来,就成了我们所说的:工具链
2、什么是交叉工具链
普通所说的,工具链指的是当前自己的本地平台的工具链。
用于交叉编译的工具链,就叫做交叉工具链。即那些工具,即编译的gcc,链接的ld,以及相关的工具,用于交叉编译的,工具链,叫做交叉工具链。
交叉工具链,很明显,是用来,交叉编译,跨平台的程序所用的。交叉工具链,和(本地)工具链类似,也是包含了很多的,对应的工具,交叉编译版本的gcc,ld,as等等。但是,由于其中最最主要的是用于编译的gcc,所以,我们也常把:交叉工具链,简称为交叉编译器
即严格意义上来说,交叉编译器,只是指的是交叉编译版本的gcc。但是实际上为了叫法上的方便,我们常说的交叉编译器,都是指的是交叉工具链。常说的交叉编译版本的gcc,比如arm-linux-gcc,实际上指代了,包含一系列交叉编译版本的交叉工具链(arm-linux-gcc,arm-linux-ld,arm-linux-as等等)而此文中,后面,所说的,如无特殊指明,均用交叉编译器指代交叉工具链。
总结:
交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。
交叉编译知识解析(一) —— 交叉编译和交叉工具链相关推荐
- 交叉编译和交叉工具链
交叉编译和交叉工具链 本地编译: 在你需要运行程序的那台机器上编译 交叉编译: 在其他机器上编译,然后在本地或者另外的机器上运行 交叉编译主要是为了, 1.将所有编译都一起集合统一起来:例如,设置一个 ...
- 交叉编译(交叉工具链)
一.交叉编译(交叉工具链) 在一个环境下编译生成一个可以在另一个环境中执行的可执行文件的工具 本地编译命令 gcc 实现把高级语言的C文件,翻译成二进制文件 是可以在虚拟机中找到的: which gc ...
- 【编译原理】交叉工具链详解
1.嵌入式开发模型-交叉开发 在嵌入式开发过程中有宿主机和目标机的角色之分,宿主机是执行编译.链接嵌入式软件的计算机,目标机是运行嵌入式软件的硬件平台.在宿主机执行编译的流程如下: 而所谓的交叉编译就 ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远程 ...
- 交叉工具链的搭建方法(测试成功)
之前安装了一个rehat6的linux系统,把交叉编译搭建给忽视了,结果在编译uboot的时候出现问题,显示找不到arm-linux-gcc.于是自己来搭建交 叉编译环境.出现好多错.先是解压时没在 ...
- arm-linux-gcc 裸机程序,Linux下ARM裸机开发-交叉工具链
初识linux下ARM的裸机开发全过程.现在总结如下: 首先说明为什么要学习裸机开发,一方面bootloader的编写要用到裸机开发的知识,另一方面就是驱动的开发.一般情况下我们进行的系统上的开发. ...
- crosstool-ng 编译交叉工具链的常见错误及解决办法
1.配置crosstool-ng产生的错误 1.1 ncurses headers files were not found Checking for 'ncurses/ncurses.h'... n ...
- 制作ARM的Linux,手工制作最新版arm-linux交叉工具链1.doc
手工制作最新版arm-linux交叉工具链1 手工制作最新版arm-linux交叉工具链 注意:本文是在ubuntu 10.04 desktop i386操作系统上完成的, 1.准备目录和环境变量 # ...
- 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试
交叉工具链 安装: 将arm-linux-gcc-4.3.2.tgz文件解压到linux根目录/下,可以发现解压后的文件在/usr/local/arm/4.3.2/文件下. 然后修改环境变量:执行命令 ...
最新文章
- 内存对齐与ANSI C中struct型数据的内存布局 【转】
- 根据数据库表gengxin实体类_Python学习第四十八天记录打call:SQLALchemy操作MySQL关系型数据库...
- ORACLE 绑定变量用法总结
- 沉淀一年零八个月,我也拿到了博客专家
- 价钱转换python_如何在python中转换货币?
- TensorFlow实现卷积、池化操作
- Go gomaxprocs 调高会引起调度性能损耗
- Thymeleaf学习总结(1)——新一代Java模板引擎Thymeleaf
- 内含20万“不可描述”图片,这个数据集千万别在办公室打开
- pooling 与 步长大于1的卷积
- 查看CPU和其他硬件温度的软件
- 微信小程序头像怎么改变形状_微信小程序 open-data更改样式 open-data 显示头像 圆形...
- linux恢复群晖数据,数据丢失的后悔药,群晖NAS备份方案详解
- 听说今年金三银四变成金一银二了。
- 人人 突破 权限 相册 查看
- 卡拉兹(Callatz)猜想
- Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset
- 【图片新闻】五角大楼的国防创新部DIU正在规划建设一个未来机器人空间站
- com.intellij.execution.ExecutionException:at com.intellij.execution.rmi.RemoteProcessSupport.acqu报错
- 第三方轮播图控件SliderLayout使用
热门文章
- (静态,动态,文件)三个版本的通讯录
- MySQL表字段类型
- 最新人工智能、大数据与复杂系统一月特训班_机器学习入门到精通
- 随着信息产业的飞速发展,项目管理对于应用开发为主的软件企业是一个行之有效的管理办法,在软件开发中项目...
- java怎么开始编写代码_Java编程入门:开始用Java编写代码
- OneNote for Windows 10 快捷键大全
- Google Pixel7 解锁安装32bit应用权限 教程
- 浅谈二维和三维图像数据
- [茶香人家:原创资料]岩茶基础名词图解
- union和union all 的区别