glib庫的交叉編譯與移植_第1頁
glib庫的交叉編譯與移植_第2頁
glib庫的交叉編譯與移植_第3頁
glib庫的交叉編譯與移植_第4頁
glib庫的交叉編譯與移植_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

glib庫的交叉編譯與移植這里需要強調(diào)一下:libc、glibc、glib是不同的庫!glibc和libc都是Linux下的C函數(shù)庫,而glib是GTK+的基礎(chǔ)庫libc是Linux下的ANSIC函數(shù)庫;glibc是Linux下的GUNC函數(shù)庫。上位機環(huán)境:PC:win7,家庭普通版虛擬機:VMware?Workstation,版本:9.0.2build-1031769FEDORA:14開發(fā)板環(huán)境:MYD-C287開發(fā)板:采用飛思卡爾imx.287ARM9芯片,Linux2.6.35內(nèi)核版本,Uboot2013.03,gcc-4.4.4交叉編譯鏈我們最終目的是在我們的開發(fā)板上能夠執(zhí)行使用了glib庫的可執(zhí)行文件。要達(dá)到這個目的我們需要幾個步驟:1、 需要使用交叉編譯鏈交叉編譯glib庫;2、 將生成的動態(tài)庫加入到文件系統(tǒng)的lib目錄中;3、 使用交叉編譯出來的glib庫,交叉編譯?c文件,然后在開發(fā)板中執(zhí)行文件;安裝前準(zhǔn)備:glib源碼包下載地址:/pub/gnome/sources/glib/2.24/這里我們使用的是glib-2.22.5.tar.gzlibffi源碼包下載地址:/libffi/libffi是glib的依賴庫,所以需要先交叉編譯這個庫,我們使用的是libffi-321.tar.gzpkg的安裝:pkg-config是一個很好的文本替換命令,主要用于編譯命令上,F(xiàn)EDORA中已安裝過該命令。第一步:交叉編譯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應(yīng)該不會遇到任何問題,然后就會生成我們需要的Makefile文件。然后就是三部曲中的makemakeinsall為了更好地在編譯時使用自定義安裝路徑里的庫,我們使用pkg-config來輔助我們編譯glib,但要運行pkg-config,首先需要制作xx.pc文件:我們先來到libffi安裝目錄下的lib/pkgconfig目錄下,里面有一個libffi.pc文件,由于這個庫是給arm用的,所以我習(xí)慣在文件名后加上-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目錄下創(chuàng)建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應(yīng)該不會遇到任何問題,并生成了Makefile文件。然后在glib目錄下創(chuàng)建glib-2.22文件夾,用于保存生成的glib庫文件。然后就是三部曲中的makemakeinsall這個時候就會在glib-2.22文件夾下看到交叉編譯好的glib庫文件。里面會有bin,include,lib,share四個文件夾,分別有我們編譯和運行時的文件和庫。第二步:將生成的動態(tài)庫加入到開發(fā)板文件系統(tǒng)的lib目錄中現(xiàn)在我們需要將編譯好的glib動態(tài)庫放到nfs文件系統(tǒng)的lib目錄下,這樣我們的程序在開發(fā)板上執(zhí)行的時候就可以調(diào)用glib動態(tài)庫了。我們輸入命令cp/home/embedclub/local/arm/glib/glib-2.22/lib/libglib-2.0*/nfs/rootfs/lib/這里我們將glib的所有庫都拷貝到了nfs中,包括靜態(tài)庫,這是不必要的,我們只需要拷貝動態(tài)庫就可以了。其中文件libglib-2.0.so是一個硬鏈接,所以我們直接拷貝這個文件就會在nfs中得到一個庫的副本文件。正確的做法是拷貝libglib-2.0.so.0.2200.5文件,并做兩個硬鏈接到這個文件,連接文件分別是libglib-2.0.so.0和libglib-2.0.so。其實正確的做法是使用cp-a命令,其中的-a參數(shù)相當(dāng)于-dpR,保持文件的連接(d),保持原文件的屬性(p)并作遞歸處理(R),所以應(yīng)該輸入:cp-a/home/embedclub/local/arm/glib/glib-2.22/lib/libglib-2.0*/home/embedclub/tmp/然后在刪除靜態(tài)編譯庫文件libglib-2.0.larm/home/embedclub/tmp/libglib-2.0.la將開發(fā)板掛載到虛擬機的nfs共享目錄:#mount-tnfs-onolock192.168.0?103:/home/embedclub/tmp/mnt將庫文件拷貝到開發(fā)板的/usr/lib目錄中:cplibglib-2.0*/usr/lib第三步:使用交叉編譯出來的glib庫,交叉編譯.c文件,然后在開發(fā)板中執(zhí)行文件我們現(xiàn)在擁有了glib的交叉編譯庫,而且在nfs文件系統(tǒng)中也有了動態(tài)庫,我們需要使用一下這個庫編譯一個有g(shù)lib函數(shù)的.C文件,并在開發(fā)板上運行起來。我們從/andylauren/article/category/6219334中選擇一個.c文件來作為我們的源程序,然后我們需要知道一些編譯時的參數(shù),比如頭文件路徑的設(shè)置,庫文件路徑的設(shè)置,在編譯時使用-I加上路徑來表示頭文件的路徑,-L表示庫文件的路徑。在fedora上我們編譯glib庫文件時使用的方法是gccxxx.c-oxxx-lglib-2.0這里的-o后面是生成的目標(biāo)文件名,不是必須要的,如果不加會生成a.out文件,-l后面是我門使用的庫文件名,是去掉了lib開頭的庫文件名,這里為什么我們沒有使用-I-L呢,因為我們已經(jīng)把這些文件放到了系統(tǒng)默認(rèn)路徑中,編譯的時候會自動去默認(rèn)路徑下找相應(yīng)的文件。交叉編譯的時候我們也需要對應(yīng)的書寫編譯命令,這里我先把命令寫出來,然后在講解,編譯命令如下: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我們要生成的目標(biāo)文件;-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我們調(diào)用的庫文件;然后我們將生成的gtree-arm文件復(fù)制到nfs文件系統(tǒng)目錄中,cpgtree-arm/home/embedclub/tmp將開發(fā)板設(shè)置為nfs掛載,然后我們啟動開發(fā)板,運行./gtree-arm,哈哈看到運行結(jié)果了,和電腦上的運行結(jié)果一樣,表示我們移植成功了。1、ECLIPSE中交叉編譯glib庫的配置進(jìn)入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■環(huán)如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⑻應(yīng)miscellaneousiSsnaredLibrarySettingsp0055GCCAssembler?GeneralLinkerflagspkg-ccKiFig-libsglib-2.^-anr>gt^ad-2.0-阿1'-IpthrMd-Irl第一次移植血淚史:下面我來講一下我這次移植的過程中遇到的問題,可以說是一步一個砍,十步一個坑,坑里還有水,水里還有丁,進(jìn)去就沒影。感覺就像是體驗了一次西天取經(jīng)的99,81難一樣。首先在網(wǎng)上根本就找不到一個完整的glib移植的教程,有的也只是只言片語,我就這里摸索著前進(jìn)。第一劫:版本選擇首先我想我的ubuntu上安裝的是glib2.0.6,那么我也是用這個進(jìn)行移植吧,然后我就開始解壓,配置./configure,然后遇到了根本找不到答案的問題,checkingforextraflagstogetANSIlibraryprototypes...configure:error:cannotruntestprogramwhilecrosscompiling在網(wǎng)上根本找不到相應(yīng)的解決辦法,甚至于帖子都沒有,沒辦法,我就換了版本,glib2.0.7,glib2.12,都是這樣,都來我試著讀了一下,意思是某個測試文件不能在交叉編譯環(huán)境中運行,真的不知道是什么情況,我覺得應(yīng)該,glib低版本和交叉編譯鏈或者編譯環(huán)境不匹配,或者低版本不支持交叉編譯。好,我換了最新版的glib2.48,報錯缺少zlib的lib和頭文件,換了多個版本,從glib2.32到glib2.28都是這樣,最后我在網(wǎng)上找到一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論