交叉编译环境完全通_第1页
交叉编译环境完全通_第2页
交叉编译环境完全通_第3页
交叉编译环境完全通_第4页
交叉编译环境完全通_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、交叉编译环境完全通当我们开发嵌入式Linux软件时,一般都要经过交叉编译这一步。如果是开发PC机上的软件,我们只要用Linux本身提供的强大的编译器(如gcc)直接编译就可以了。而一般的嵌入式设备所用的CPU和PC机上的CPU有着不同的架构,这样就要求我们在PC机上编译出适用于嵌入式设备 CPU架构的软件,这就是我们所说的交叉编译。下面我们用一个例子来 详细说明交叉编译是如何工作的。一、所用平台Redhat 9.0二、建立交叉编译环境很显然,要交叉编译就得有一个特殊的曲境I作前提,这里的环境就是一个与PC机不同的一套库函数和编译器。用这样的库函数和编译器编译出来的应用程序就可以在嵌入式设备上跑

2、了。Sitsang 板提供的交叉编译工具链为:gnupro-bin-glibc2.2.4.tgz, xscale-arm-linux-toolchain.tgz :cd /回根目录tar zxvf xscale-arm-linux-toolchain.tgz/解压,解压后文件在 /usr/local/ 下面echo export PATH=/usr/local/a rm- linux/bin:$PATH>>|bashrc/ 设置环境变量source /.bashrccd /usr/进入/usr文件夹,为了把 glibc库安装在该目录下tar zxvf /tmp/gnupro-bin

3、-glibc2.2.4.tgz/解压这样我们的交叉编译环境就建立好了,怎么样,是不是很简单。下面我们就来测试一个简单的例子。/*Hello.c*/#i nclude <stdio.h>main ()char *hel lo= II helion II ;printf( %s II ,hello);程序输好以后确认无误,保存。进入程序文件所在目录比如在/root/hello/下面:cd /root/helloarm-linux-gcc hello.c -o hello (-o 可以理解为I标为生成 II)第一行改不用解释了吧,第二行中arm-linux-gcc是第一次出现,有人可能会

4、问这个哪里来的,不妨打开刚才安装的交叉编译工具目录/usr/local/arm-li nux/arm-li nu x/bi n/可以发现里面有一个arm-linux-gcc文件,这个就是针对arm的CPU的gcc编译器了。以后用其它编译 工具链式也可以通过这种方法看看其编译器是什么了。编译好了以后就可以下载到目标机进行测试了。当然也可以先在 PC机上测试正误。用gcc hello.c -o hello就可以生成PC机上 程序了,在运行./hello就可以发现终端显示hello!字样。三、提高篇前面我们编译了一个小例子,当然这个例子只有一个hello !显示,没有任何其他的人机交互,所以当然也就

5、不过瘾了。开发嵌入式Linux的交互界面可以有许多开发环境。我们这里选用Qt/embedded作为界面开发平台。首先当然是编译Qt/embedded 了。所用的软件包为:qt-embedded-2.3.2.tar.gz。不过我们的开发板带有一块触摸屏,为了让用Qr/embedded做出来的程序能够支持触摸屏,必须要把触摸屏的库进行同时编译,开发板提供的触摸屏库为tslib.tar,下面开始编译(设当前路径为/opt,两个软件包也放在这个路径下):1. TSLIBbzip2 -dc tslib.tar.bz2 | tar xv /解压,生成的文件夹名为 tslib ,具体bzip2的用法可以 用

6、 man bzip2 来查看cd tslib/进入该文件夹export CC=arm-linux-gccII用CC这个符号代替arm-linux-gcc,有了这一句后,我们前面编译时用arm-linux-gcc就可以用CC来代替了./autoge n.sh -host=arm-l inuxII这一句表示将编译适合arm架构cpu的库,其实打开autogen.sh这个文件,我们将发现这是一个批处理的shell文件其中 一host=arm-linux是./configure 的参数。其中内容如下:#!/bi n/sh# $ld: autogen.sh,v 2001/12/2221:1

7、2:06 rmk Exp $libtoolize -force -copyaclocalautoheaderautomake -add-miss ing-copyautoc onf./c on figure $*具体每条的含义是:make /当然是编译啦,具体说是对前面con figure好以后的配置进行编译2 .安装 Qt/Embedded.tar xfz qt-embedded-2.3.2.tar.gz /解压,生成 qt-2.3.2 文件夹,具体 tar的用法也可以 用 man tar 来查看mv qt-2.3.2 qte/改文件夹名,完全是为了简单,没什么实际意义。可以不用cd qte

8、/进入文件夹export QTDIR=$PWD /设置QTDIR替代当前目录,$PWD可以取得当前目录 export PATH=$QTDIR/bin:$PATH/添加路径到环境变量,以便以后运行命令是可以从这个路径找 export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH / 添加库文件路径cp ./tslib/src/.libs/* ./qte/lib/把触摸屏库.libs文件夹中库文件拷贝到qte的库文件夹中等待一起编译cp -a ./tslib/plugins/.libs/*.so ./qte/lib/同上./c on figure -xpl

9、atform linu x-arm-g+/配置,-xplatform 参数表示将编译面向arm平台的程序make /编译cd ./退出1.编译 TMAKEtar xfz tmake-1.11.tar.gz / 解压cd tmake-1.11/ 进入目录export TMAKEDIR=$PWD /用TMAKEDIR替代当前路径,也就是 tmake的安装路径export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g+/设置这个环境变量是说明用tmake时调用linux-arm-g+ 也就是适合arm架构的C+编译器export PATH=$TMAKEDIR/bin

10、:$PATH/ 设置 tmake 的工具路径(里面有 progen , tmake ,tmake-win三个工具,下面会有介绍)经过以上几个编译后我们来回顾一下:首先,触摸屏的库有了,也编译好了;其次,也有了设计交互界面的平台Qt/embedded,并且把触摸屏的库也编译进去了,也就是说用这个平台做的界面编译后可以支持触摸屏;最后,编译面向arm架构的强大的tmake编译器也有了,可谓万事俱备,只欠东风了。下面我们就来试试我们的环境好不好用(注意编译以上三个软件包都应该在同一个终端中,后面会有解释)/*a simple in terface*/1 #in elude vqapplicati o

11、n.h>2 #i nclude <qlabel.h>3 int main(int argc, char *argv)4 5 QApplication app (argc, argv);6 QLabel *label =newQLabel("Hello Qt!", 0);7 app.setMa in Widget(label);8 label->show();9 retur n app.exec();10 程序这里就不解释了,大家可参阅C+GUI Programming with Qt3。这里我们只说编译方法。首先,我们可以用qmake来编译一个可以在

12、PC机上运行的程序,这时先把这个文件存在一个叫hello文件夹(也可以不用,不过这样方便)中,名字为hello.cpp,然后再命令行中切换到这个目录中qmake -project/以当前文件夹名生成.pro文件(如文件夹名为xxx,则生成文件)qmake / 生成 Makefile 文件make/编译一会儿我们既可以编译出来了。命令行切换到该目录,打入./hello运行可见:这里本来会显示一个图片的现在我们开始用我们刚才搭建的交叉编译环境编译一下看看,前提是刚才编译环境的终端还没有关闭。那么,命令行直接切换到hello目录下:progen -n hello p

13、 / 生成.pro 文件tmake Makefile / 生成 Makefile 文件make/编译在第一句完成以后有一处小改动,打开文件,其内容如下:TEMPLATE = appCONFIG = qt warn_on releaseHEADERS =LIBS+= -lts/加上这句SOURCES = hello.cppINTERFACES =TARGET = hello加上那一句是因为触摸屏的库在-另一个地方II,所以要指定路径给编译程序进行链接编译。 这样,适用于arm架构CPU的第一个程序就编译好了。下载到目标板运行就可以知道结果

14、 了。同时也可以改 Makefile文件,其里面的内容为:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffu u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u uHff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

15、 ff ff ff ff ff ff ff ffII II II II II II II II II II II II II II II II II II II II II II II# Makefile for building hello# Gen erated by tmake at 20:35, 2004/08/10# Project: hello# Template: appff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff f

16、f ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffu u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u uH ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffII II II II II II II II II II II II II II II II II II II II II fj fj# Compiler, tools and optionsCC = arm-l in

17、u x-gccCXX = arm-li nux-g+CFLAGS = -pipe -Wall -W -02 -DNO_DEBUGCXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUGINCPATH = -l$(QTDIR)/i ncludeLINK = arm-l inu x-gccLFLAGS =LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte -ts / 这里就是要加的东西MOC = $(QTDIR)/bi n/mocUIC = $(QTDIR)/bi n/uicTAR = tar -cfGZIP = gzip -9f# Files/ 后面省略。回到刚才,我们指明了一定不要关闭编译Qt和tmake的终端,是因为编译时设置的环境变量只是暂时设置(除了设置工具链那一句设置环境变量一句),且只对当前终端有效,而我们编译程序时就要用到这些比境变量II,关了终端以后这些环境变量就没了。所以不能关。 但话又说回来,总不能永远不关吧,所以我们要设置一下用户环境变量。新打开一个终端, 输入:vi .bashrc打开环境变量文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论