交叉编译

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

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

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. 1.CPU架构:比如ARM,x86,MIPS等等;

  2. 2.字节序:大端(big-endian)和小端(little-endian);

  3. 3.浮点数的支持;

  4. 4.应用程序二进制接口(Application Binary Interface,ABI);

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

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

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

交叉编译工具链是进行交叉编译的必不可少的工具,是嵌入式开发人员必须熟练掌握的技能。我们会在后续文章中对交叉编译工具链进行介绍。

(0)

相关推荐

  • 0基础学Java(三)Java语言的特性

    Java语言的特性 1.简单性 在Java语言当中真正操作内存的是:JVM(Java虚拟机) 所有的java程序都是运行在Java虚拟机当中的. 而Java虚拟机执行过程中再去操作内存. 对于C或者C ...

  • (7条消息) ubuntu16.04 安装交叉编译工具aarch64

    前言 最近需要把人脸识别代码放到RK3399Pro的嵌入式板子上,所以编写好的c++ 代码要放到板子上编译,或者在ubuntu系统上使用交叉编译工具,编译好可执行文件在放到板子里运行.为了在能在ubu ...

  • vcpkg新特性:交叉编译下的主机依赖关系

    如果你还不熟悉我们的C++包管理器vcpkg,那么:欢迎阅读本文. 今天的这篇文章,我们将覆盖一些关于vcpkg的中高级主题,所以,你可能需要先从我们之前的博文中了解一下vcpkg的概念性知识,最好能 ...

  • 用buildroot建立交叉编译环境

    http://blog.sina.com.cn/s/blog_4697cdcd0100prf9.html 这个实验主要学习交叉编译环境的安装,方法很多,首先可以自己下载相关的包,然后手动安装.当然现在 ...

  • Qt移植:Ubuntu16.04 交叉编译qt5.9.6详细教程

    博主是嵌入式小萌新,项目需要移植qt到arm开发板上,历经千辛万苦解决了各种问题,最后终于成功了,所以整理了开发笔记给更多的小伙伴参考. 1.准备阶段 ①下载交叉编译器aarch65-linux-gn ...

  • (9条消息) 嵌入式开发环境配置nfs, tftp,交叉编译工具

    基于ubuntu 安装NFS 安装nfs: sudo apt-get install nfs-kernel-server 配置: sudo vim /etc/exports 在最后一行添加: /hom ...

  • BlackFin交叉编译环境搭建

    BlackFin交叉编译环境搭建 分类: LINUX 2011-10-12 12:30:05 BlackFin交叉编译环境搭建 ubuntu10.04环境下 参照 toolchin.u-boot.ke ...

  • (3条消息) 交叉编译AWS IOT C++ SDK及环境测试

    开始前 先强烈建议 登录控制台走一遍亚马逊的引导流程,并用nodejs版 在你ubuntu上跑一边,把策略文件生成了.并了解如何创建事物(设备) 文档:https://docs.aws.amazon. ...

  • 从零开始编译一个gcc的交叉编译工具链

    从零开始编译一个gcc的交叉编译工具链 为了避免和host的编译系统耦合,很多sdk和需要和客户联编的软件都会提供自己的工具链或者要求客户的系统满足某种工具链要求. 大概梳理下来独立的ToolChai ...

  • imx6ull+debian10 构建静态qt交叉编译环境

    # PC:Ubuntu18.04 # GCC: arm-linux-gnueabihf- 7.4.0 # 开发板: # imx6ull+debian10(文件系统为野火提供的) # 此处需要编译的是带 ...