glib库的交叉编译与移植_第1页
glib库的交叉编译与移植_第2页
glib库的交叉编译与移植_第3页
glib库的交叉编译与移植_第4页
glib库的交叉编译与移植_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

glib库的交叉编译与移植这里需要强调一下:libc、glibc、glib是不同的库!glibc和libc都是Linux下的C函数库,而glib是GTK+的基础库libc是Linux下的ANSIC函数库;glibc是Linux下的GUNC函数库。上位机环境:PC:win7,家庭普通版虚拟机:VMware®Workstation,版本:9.0.2build-1031769FEDORA:14开发板环境:MYD-C287开发板:采用飞思卡尔imx.287ARM9芯片,Linux2.6.35内核版本,Uboot2013.03,gcc-4.4.4交叉编译链我们最终目的是在我们的开发板上能够执行使用了glib库的可执行文件。要达到这个目的我们需要几个步骤:1、 需要使用交叉编译链交叉编译glib库;2、 将生成的动态库加入到文件系统的lib目录中;3、 使用交叉编译出来的glib库,交叉编译・c文件,然后在开发板中执行文件;安装前准备:glib源码包下载地址:/pub/gnome/sources/glib/2.24/这里我们使用的是glib-2.22.5.tar.gzlibffi源码包下载地址:/libffi/libffi是glib的依赖库,所以需要先交叉编译这个库,我们使用的是libffi-321.tar.gzpkg的安装:pkg-config是一个很好的文本替换命令,主要用于编译命令上,FEDORA中已安装过该命令。第一步:交叉编译glib库在交叉编译glib前我们需要先交叉编译glib的依赖库libffi1、libffi的安装ffi是glib依赖的一个库,在交叉编译以前需要先交叉编译libffi将libffi-3.2.1.tar.gz甩入FEDORA的/home/embedclub/local/arm,目录中。解压缩源码:tarzxvflibffi-3・2・1・tar・gz并建立安装路径:/home/embedclub/local/arm/glib在解压缩文件目录libffi-3.2.1中,直接开始配置操作键入命令:CC=arm-none-linux-gnueabi-gcc・/configure--prefix=/home/embedclub/local/arm/glib/ffi/--host=arm-none-linux-gnueabi应该不会遇到任何问题,然后就会生成我们需要的Makefile文件。然后就是三部曲中的makemakeinsall为了更好地在编译时使用自定义安装路径里的库,我们使用pkg-config来辅助我们编译glib,但要运行pkg-config,首先需要制作xx.pc文件:我们先来到libffi安装目录下的lib/pkgconfig目录下,里面有一个libffi.pc文件,由于这个库是给arm用的,所以我习惯在文件名后加上-arm:cplibffi・pclibffi-arm・pc然后将libffi-arm.pc拷贝到/usr/lib/pkgconfig/下:cplibffi-arm.pc/usr/lib/pkgconfig/这样pkg-config命令就可以识别到这个文件,大家可以先键入pkg-config--cflagslibffi-arm看看会打印出什么呢?-I/home/embedclub/local/arm/glib/ffi/lib/libffi-3.2.1/include这就是我们在交叉编译时需要用到的头文件路径。2、交叉编译glib库跟一般的安装一样,开始使用configure生成Makefile:解压glib-2.22.5.tar.gztarzxvfglib-2・22・5tar.gz)得到glib-2.22.5源码包目录。先在glib-2.22.5目录下创建cache文件:geditarm-linux.cache然后在文件中输入:glib_cv_stack_grows=noglib_cv_uscore=noac_cv_func_posix_getpwuid_r=yesac_cv_func_posix_getgrgid_r=yesglib_cv_have_qsort_r=no运行configure的时候会从cache文件中读入配置,再将配置的log写入此文件键入命令:CC=arm-none-linux-gnueabi-gcc・/configure--prefix=/home/embedclub/local/arm/glib/glib-2・22/--host=arm-none-linux-gnueabi--cache-file=arm-linux・cache应该不会遇到任何问题,并生成了Makefile文件。然后在glib目录下创建glib-2.22文件夹,用于保存生成的glib库文件。然后就是三部曲中的makemakeinsall这个时候就会在glib-2.22文件夹下看到交叉编译好的glib库文件。里面会有bin,include,lib,share四个文件夹,分别有我们编译和运行时的文件和库。第二步:将生成的动态库加入到开发板文件系统的lib目录中现在我们需要将编译好的glib动态库放到nfs文件系统的lib目录下,这样我们的程序在开发板上执行的时候就可以调用glib动态库了。我们输入命令cp/home/embedclub/local/arm/glib/glib-2.22/lib/libglib-2.0*/nfs/rootfs/lib/这里我们将glib的所有库都拷贝到了nfs中,包括静态库,这是不必要的,我们只需要拷贝动态库就可以了。其中文件libglib-2.0.so是一个硬链接,所以我们直接拷贝这个文件就会在nfs中得到一个库的副本文件。正确的做法是拷贝libglib-2.0.so.0.2200.5文件,并做两个硬链接到这个文件,连接文件分别是libglib-2.0.so.0和libglib-2.0.so。其实正确的做法是使用cp-a命令,其中的-a参数相当于-dpR,保持文件的连接(d),保持原文件的属性(p)并作递归处理(R),所以应该输入:cp-a/home/embedclub/local/arm/glib/glib-2.22/lib/libglib-2.0*/home/embedclub/tmp/然后在删除静态编译库文件libglib-2.0.larm/home/embedclub/tmp/libglib-2.0.la将开发板挂载到虚拟机的nfs共享目录:#mount-tnfs-onolock192.168.0・103:/home/embedclub/tmp/mnt将库文件拷贝到开发板的/usr/lib目录中:cplibglib-2.0*/usr/lib第三步:使用交叉编译出来的glib库,交叉编译.c文件,然后在开发板中执行文件我们现在拥有了glib的交叉编译库,而且在nfs文件系统中也有了动态库,我们需要使用一下这个库编译一个有glib函数的.C文件,并在开发板上运行起来。我们从/andylauren/article/category/6219334中选择一个.c文件来作为我们的源程序,然后我们需要知道一些编译时的参数,比如头文件路径的设置,库文件路径的设置,在编译时使用-I加上路径来表示头文件的路径,-L表示库文件的路径。在fedora上我们编译glib库文件时使用的方法是gccxxx.c-oxxx-lglib-2.0这里的-o后面是生成的目标文件名,不是必须要的,如果不加会生成a.out文件,-l后面是我门使用的库文件名,是去掉了lib开头的库文件名,这里为什么我们没有使用-I-L呢,因为我们已经把这些文件放到了系统默认路径中,编译的时候会自动去默认路径下找相应的文件。交叉编译的时候我们也需要对应的书写编译命令,这里我先把命令写出来,然后在讲解,编译命令如下:arm-none-linux-gnueabi-gccGTree.c-ogtree-arm-I/home/embedclub/local/arm/glib/glib-2.22/include/glib-2.0-I/home/embedclub/local/arm/glib/glib-2.22/lib/glib-2.0/include-L/home/embedclub/local/arm/glib/glib-2.22/lib-lglib-2.0其中arm-linux-gcc是交叉编译用的gcc,还有一个arm-none-linux-gnueabi-gcc命令,其实和它一模一样;GTree.c是我们要编译的源码文件,-ogtree-arm我们要生成的目标文件;-I/home/embedclub/local/arm/glib/glib-2.22/include/glib-2.0-I/home/embedclub/local/arm/glib/glib-2・22/lib/glib-2・0/include我们头文件路径;-L/home/embedclub/local/arm/glib/glib-2・22/lib-lglib-2・0我们库文件路径;-lglib-2.0我们调用的库文件;然后我们将生成的gtree-arm文件复制到nfs文件系统目录中,cpgtree-arm/home/embedclub/tmp将开发板设置为nfs挂载,然后我们启动开发板,运行./gtree-arm,哈哈看到运行结果了,和电脑上的运行结果一样,表示我们移植成功了。1、ECLIPSE中交叉编译glib库的配置进入glib安装目录的lib/pkgconfig目录下:cd/home/embedclub/local/arm/glib/glib-2・22/lib/pkgconfig/cpglib-2・0・pcglib-2・0-arm・pccpglib-2・0-arm・pc/usr/lib/pkgconfig/cpgthread-2・0・pcgthread-2・0-arm・pc5)cpgthread-2.0-arm.pc/usr/lib/pkgconfig/6)eclipse配置:projectfpropertiesfC/C++GeneralfPathandSymbolsfGNUCfincludes-Add加入glib库的头文件路径,如下图所示:阳斑 知1*!向鸟5)cpgthread-2.0-arm.pc/usr/lib/pkgconfig/6)eclipse配置:projectfpropertiesfC/C++GeneralfPathandSymbolsfGNUCfincludes-Add加入glib库的头文件路径,如下图所示:阳斑 知1*!向鸟IIbtewficeauidwr卜qc+fBuildpQCffGeneniCrfeSyiefikriyp^b-riEEerIJTSWWNappng-Canliopjnabcn:口皿q[虹b*]CManageConttgurabans...R«h5anaProlKt昭Marw帖PTaskF^fXElmryLjSlndudK■环如is*WiUbrancspiiEry啡抵]占如代「RjckEncEjUd...CE*「〕CkIkcEspam|hweCioNh7)eclipse配置:projectfpropertiesfC/C++BuildfSettingsfCrossGCCCompilerfMiscellaneous,加入命令'pkg-config--cflagsglib-2.0-armgthread-2.0-arm如下图所示:PropertiestorCiOIM_APP_DEBUGtypenitier飞戏 总>ResouixeBulders0C/C++fljjildBuildEnablesDiscoveryDpdop?EnviranmentboggingTsoiQiainEditorbC/C++OEiierdlProjectFererences瓯irVDebugSettingsi>TSEkftepasitory电Ikl血d迤CrossSettingsp崗匚roMGCC口rnfjiibi^PreprocessDr画SymbolsiSinciuriHi^CIptiniizaaan^OebJedging■Miscrilsneous誉warningsp55CrDEEGCCLinkerGeneraliSlibranst^MiscEihneDiJS童SirredLibrarySetturigsp¥■匚re暑G£XAtMtrUler£GeneralOtherflags|-c-Bmessage-laigtii-(]'pkg-corrfig-tflags^lb-2_0-amigttiread-a.O-am-V匚IgtOEEi■酉Siwon:ANSIprograms<-aMi)□PDsrtionllrdeperriefrtCade(-fPICI8)eclipse配置:projectfpropertiesfC/C++BuildfSettingsfCrossGCCLinkerfMiscellaneous,加入命令'pkg-config--libsglib-2・0-armgthread-2.0-arm如下图所示:Propertiesfor岸ResounzeBuilden;POCt+SLildBuildVariablesDiscoutryQptwisEnvironmentLoggingSettings岸ResounzeBuilden;POCt+SLildBuildVariablesDiscoutryQptwisEnvironmentLoggingSettingsTbclChainEditor»C/C++QenEfalProjectRjeferencesF%jniD«bugSettingskTaskRepositDry财kF电玳酋CrassSettingsf®CMD55B匚匸CompilerPreprocessor^Symbois^Includes^ppdniizatiQnIte&uggrql^WaniDrqs誉KMlHElbnEWEp需Cross6CCLinkeriSrGeflerai固Lib⑻应miscellaneousiSsnaredLibrarySettingsp0055GCCAssembler®GeneralLinkerflagspkg-ccKiFig-libsglib-2.^-anr>gt^ad-2.0-阿1'-IpthrMd-Irl第一次移植血泪史:下面我来讲一下我这次移植的过程中遇到的问题,可以说是一步一个砍,十步一个坑,坑里还有水,水里还有丁,进去就没影。感觉就像是体验了一次西天取经的99,81难一样。首先在网上根本就找不到一个完整的glib移植的教程,有的也只是只言片语,我就这里摸索着前进。第一劫:版本选择首先我想我的ubuntu上安装的是glib2.0.6,那么我也是用这个进行移植吧,然后我就开始解压,配置./configure,然后遇到了根本找不到答案的问题,checkingforextraflagstogetANSIlibraryprototypes...configure:error:cannotruntestprogramwhilecrosscompiling在网上根本找不到相应的解决办法,甚至于帖子都没有,没办法,我就换了版本,glib2.0.7,glib2.12,都是这样,都来我试着读了一下,意思是某个测试文件不能在交叉编译环境中运行,真的不知道是什么情况,我觉得应该,glib低版本和交叉编译链或者编译环境不匹配,或者低版本不支持交叉编译。好,我换了最新版的glib2.48,报错缺少zlib的lib和头文件,换了多个版本,从glib2.32到glib2.28都是这样,最后我在网上找到一

温馨提示

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

评论

0/150

提交评论