文章目录

  • 交叉编译
    • 1、编译
    • 2、本地编译
    • 3、交叉编译
  • 交叉编译工具链

交叉编译

在嵌入式系统开发中,经常会听到一个词:交叉编译。到底什么是"交叉编译"呢?为什么要使用"交叉编译"呢?今天这篇文章,我们来讨论下这个话题。

在讨论交叉编译之前,我们先来聊聊编译。

1、编译

在程序开发中,使用高级语言编写的代码被称为源代码,比如用C语言编写的后缀名为.c的文件,或者C++编写的后缀名为.cpp的文件。源代码不能被机器执行,必须转换成二进制的机器代码(指令+数据)才能被CPU执行。将源代码转换成机器代码的过程称为编译(Compile),编译的工作需要编译器(Complier)来完成。

编译器对源代码进行语法检查,只有没有语法错误的源代码才能被编译通过。源代码经过编译后,并没有生成最终的可执行文件,而是生成一种被称为目标文件(Object File)的中间文件。比如,Visual C++的目标文件后缀名为.obj,而GCC的目标文件后缀名为.o

源代码可能包含多个源文件,比如main.c/fun1.c/fun2.c等等,编译器会对源文件逐个进行编译。因此,有几个源文件,就会生成几个目标文件;

目标文件并不能被执行,因为它可能存在一些问题,比如源文件之间的引用关系导致的问题。

举个例子:文件A.c引用了文件B.c中的变量"EXT_someflag",A.c和B.c分别编译生成A.o和B.o,A.o中并没有变量"EXT_someflag"的定义,必须依靠B.o才能形成完整的代码。

同样的情况表现在源代码对库函数的引用。

把经过编译后生成的目标文件,按照其内在引用关系彼此相连接而生成一个完整的、可执行的文件的过程称为链接。

链接工作由链接器完成。

因此,源文件生成可执行文件要经过编译和链接两个步骤才能完成。为了方便,我们也把这个过程统称为编译。本文的主题"交叉编译"也是包含了编译和链接的步骤,不再赘述。

与交叉编译相对应的是"本地编译(native compile")。

理解本地编译有助于更好地理解交叉编译,所以,我们先来看看什么是本地编译?

2、本地编译

所谓"本地编译",是指编译源代码的平台和执行源代码编译后程序的平台是同一个平台。这里的平台,可以理解为CPU架构+操作系统。比如,在Intel x86架构/Windows 10平台下、使用Visual C++编译生成的可执行文件,在同样的Intel x86架构/Windows 10下运行。

3、交叉编译

所谓"交叉编译(Cross_Compile)",是指编译源代码的平台和执行源代码编译后程序的平台是两个不同的平台。比如,在Intel x86架构/Linux(Ubuntu)平台下、使用交叉编译工具链生成的可执行文件,在ARM架构/Linux下运行。

交叉编译是相对复杂的,必须考虑如下几个问题:

1、CPU架构:比如ARM,x86,MIPS等等;
2、字节序:大端(big-endian)和小端(little-endian);
3、浮点数的支持;
4、应用程序二进制接口(Application Binary Interface,ABI);

为什么要使用交叉编译呢?主要有两个原因:

1、交叉编译的目标系统一般都是内存较小、显示设备简陋甚至没有,没有能力在其上进行本地编译;

2、有能力进行源代码编译的平台CPU架构或操作系统与目标平台不同;

交叉编译工具链是进行交叉编译的必不可少的工具,是嵌入式开发人员必须熟练掌握的技能。

参考文章1:嵌入式开发 | 什么是交叉编译(CROSS_COMPILE)

参考文章2:一次搞定 Arm Linux 交叉编译

交叉编译工具链

参考文章:交叉编译工具链

Arm Linux 交叉编译(交叉编译是什么?CROSS_COMPILE)(交叉编译工具链【待更】)相关推荐

  1. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

  2. arm linux 加载.a,如何将libc.a链接到arm-linux中的共享库中使用arm-none-linux-gnueabi-gcc...

    在一个项目中,我的同事创建了一个静态库,例如liba.a,它与app链接. 在liba.a中,他将libc malloc()覆盖为其所有者版本. 我创建了一个共享库libs.so,它也与app链接. ...

  3. linux如何安装交叉工具链,Linux:制作mipsel 交叉工具链 (更新版)

    1.代码结构为: setup ---> 源代码压缩包 src --->源码 ~/code/cross-compile$ ls src/ binutils-2.24 gcc-4.7.1 gd ...

  4. linux c++ toolchain 配置文件,一步一步建立基于ARM+Linux的cross toolchain

    声明:本文在参考网上资料的基础上,以梁元恩的<如何为嵌入式开发建立交叉编译环境>为蓝本修改而成.对于自己在建立过程中遇到的问题进行了详细的说明,本文随自己学习的深入会进行相应的更新. 1引 ...

  5. Linux ARM交叉编译工具链制作过程

    一.下载源文件 源代码文件及其版本与下载地址: Binutils-2.19.tar.bz2 http://ftp.gnu.org/gnu/binutils/ gcc-4.4.4.tar.bz2 htt ...

  6. linux top交叉编译_Linux 系统下ARM Linux交叉编译环境crosstool工具

    Linux系统下ARM Linux交叉编译环境的建立目前流行的有三种途径. 一.使用别人编译好的开发工具链本文引用地址:http://www.eepw.com.cn/article/201611/31 ...

  7. arm hisiv100 linux,hisiv100交叉编译工具链安装

    hisi交叉编译工具链安装 一.         摘要: 交叉编译简单的说,就是A机器上编译生成,运行在B机器上.那么在A机器上的编译工具安装,就是本文所要描述的内容. 工欲善其事必先利其器,所以交叉 ...

  8. arm linux下交叉编译valgrind工具进行内存泄露检测和性能分析

    C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题.如果crash的地方正是内存使用错误的地方,说明你人品好.如果crash的地方内存明显不是consistent的 ...

  9. 【linux系统如何安装arm交叉编译工具链】

    文章目录 前言 一.arm交叉编译器介绍 命名规则 具体编译器 二.Arm GNU Toolchain安装 总结 前言 本文简要介绍arm交叉编译器及工具链的安装方法 一.arm交叉编译器介绍 命名规 ...

最新文章

  1. 安装oracle后在cmd,在WINDOWS上安装ORACLE RAC的注意事项
  2. php swoole编译,编译安装swoole1.7.9,PHP版本5.6.5
  3. 2019 半导体领袖新年展望(一)| 半导体行业观察
  4. Redis的数据类型以及每种数据类型的使用场景
  5. Spring Boot系列——7步集成RabbitMQ
  6. 动态子类化CComboBox以得到子控件EDIT及LISTBOX
  7. vu项目中按F5刷新element菜单没有根据路由匹配菜单解决办法
  8. WPF中的Bitmap与byte
  9. 线程的局部变量ThreadLocal概念
  10. wxml 判断 小程序_如何判断小程序外包公司是否靠谱
  11. Kubernetes控制器--副本集ReplicaSet
  12. 用恋爱常识来解释编程术语
  13. 搞不明白为什么大家都在学习 k8s
  14. 如何系统的自学python-自学Python应该如何正确系统学习,避免少走弯路
  15. 小D课堂 - 新版本微服务springcloud+Docker教程_4-06 Feign核心源码解读和服务调用方式ribbon和Feign选择...
  16. 《HTML与CSS入门经典(第8版)》——2.5 测试Web内容
  17. 图片类word报告生成器
  18. 智慧社区电商后台管理系统
  19. 从软件的价值体系开始向技术的反向分析
  20. PCL:点云数据(*.pcd)文件格式详解

热门文章

  1. 《CLR Via C# 第3版》笔记之(十九) - 任务(Task)
  2. Pocket pc模拟器与PC机传输文件的方法
  3. 最长回文子串python_最长回文子串(Python)
  4. ftp软件哪个好用_和平精英录屏软件哪个好用 和平精英录屏软件介绍
  5. 【转摘】Word提升效率的快捷键
  6. CONVT_NO_NUMBER
  7. SAP系统与MES系统的数据协同技术方案
  8. SAP:查找某个请求号的传输者是谁
  9. 从音乐到全“声”态,腾讯音乐发展的“中国范本”
  10. C语言程序设计 练习1-13