交叉编译
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler)。
这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代 码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过 程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太 可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力 很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
例子:
1.2 搭建交叉编译环境
1.2.1 实验环境
交叉编译工具:arm-linux- 4.2.2
编译平台:Ubuntu10.10
开发板类型:UT-S3C6410
1.2.2 搭建步骤
1) 在/usr/local/下建立交叉编译器的安装目录arm:
sudo mkdir /usr/local/arm
2)将下载的交叉编译器包解压到/usr/local/arm目录下:
sudo tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/local/arm/
3)解压成功后,修改PATH环境变量:
sudo vim /etc/profile
在文件为加入交叉编译器arm-linux-所在的路径:
export PATH=$PATH:/usr/local/arm/4.2.2-eabi/usr/bin
然后退出vim。
4) 更新一下配置文件/etc/profile:
source /etc/profile
5)检测是否安装成功:
现在就可以使用交叉编译器了,写一个测试程序helloworld,交叉编译下,看是否能在开发板上运行。
i. 交叉编译测试程序
arm-linux-gcc helloworld.c -o helloworld
ii.把生成的可执行文件helloworld复制到NFS的挂载目录下:
sudo cp ./helloworld /nfsboot
注意:本实验中开发板使用NFS挂载rootfs,nfsboot是NFS的挂载目录。
iii.在超级终端上运行:
./helloworld
执行结果:
相关推荐
Cmake交叉编译环境配置文档 1、设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译: SET(CMAKE_SYSTEM_NAME Linux) 其中Linux是要编译过去的平台,如果你是在Linux下交叉...
ARM64下QT需要用到QWebEngine模块,网上很多资源交叉编译QT时,均默认跳过此步骤,没跳过此步骤的很多未能详细提供交叉编译webengine模块所依赖的库,导致此模块无法交叉编译通过,资源中包含了arm64下交叉编译的...
rk交叉编译工具
飞腾交叉编译环境搭建之交叉编译工具链配置
该SDK适用于树莓派设备,其中的openssl和paho.mqtt.c的动态库是在Ubuntu上交叉编译过的,其中的MQTTClient_publish.c是一个发布程序,MQTTClient_subscribe.c是订阅程序。 使用方法:我们只需要在ubuntu上安装好...
文档包含完整的例子,交叉编译还提供了下载链接,保证有用,不成功可留言 centos7下进行aarch64(arm64)交叉编译工具安装 iperf3交叉编译并在Android下运行 iperf3带宽TCP、UDP性能测试 怎么5分变6分了,不...
Qt交叉编译后aarch64-linux-gnu-成功运行在Zynq UltraScale+MPSoC上,文件详细记录的整个过程,因为是公司项目需要,所以每一步都是亲自验证,其中还包括了Qt编译后的文件、最终的工程源码,以及解决了整个过程中很...
交叉编译libx加GTK+2.1时候用到库各个库文件的集合,不用花费时间网上一个一个下载,已经经过本人亲测试实测,还可以编译GTK+directFB 1.1 libs_for_gtk Dir: atk-1.25.2.tar.gz atk-1.26.0.tar.gz ...
什么是交叉编译环境 GCC 交叉编译工具链 重建交叉编译器 4.3.8 测试交叉编译工具链 到此为止,已经介绍完了用分步构建的方法建立交叉编译工具链。下面通过一个简单的程序测试刚刚建立的交叉编译工具链看是否能够...
libwebscokets的交叉编译,从cmake开始实际操作可行。
在linux系统上,用自带的交叉编译工具对openssl源码进行交叉编译(该过程可参考百度),生成对应的静态和动态库,然后将生成的库拷贝至arm设备的QT库锁存放的位置,这样的目的是当我们在设备上跑qt程序时,使用https...
arm平台下使用ndk工具交叉编译python,用于android系统;android-arm平台ndk交叉编译python
交叉编译环境完全通 当我们开发嵌入式Linux软件时,一般都要经过交叉编译这一步。如果是开发PC机上的软件,我们只要用Linux本身提供的强大的编译器(如gcc)直接编译就可以了。而一般的嵌入式设备所用的CPU和PC机上...
交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机,后者称为主机。采用交叉编译的主要原因在于,一般嵌入式...
mysqlmysql-connector交叉编译总结,详细说明如何将mysqlclient库交叉编译到arm、powerpc等环境
mqtt跨平台arm交叉编译,MQinstall是mqtt安装路径,arminstall是openssl的库包,makefile已经移植好的,如果交叉编译环境搭建好,直接make就可以了
菜鸟学习ARM——安装交叉编译链记录,及编译jpeg
ARM平台的ppp-2.4.4交叉编译 ARM平台的ppp-2.4.4交叉编译 Phenix 2007.04.30 交叉编译器 : arm-linux-gcc 3.3.2 ppp版本 : both 2.4.4 and 2.4.3 are OK
海思v400交叉编译工具 海思v400交叉编译工具 海思v400交叉编译工具
压缩包内部包含7个软件:libdnet snort daq pcap pcre zlib openssl,每个交叉编译的步骤。文档只是记录自己编译的过程,基本编译按照模式来不会出问题,依赖库需要自己移到开发板上。可自行考虑连接静态库