由于是第一次交叉編譯,不知道會(huì)出現(xiàn)什么問(wèn)題,思路就是先把gcc和ld都改成arm的,然后遇到什么問(wèn)題在解決什么問(wèn)題,以下過(guò)程都是在這個(gè)思路下進(jìn)行。
只是把gcc改為arm-none-linux-gnueabi-gcc,ld改為arm-none-linux-gnueabi-ld,其他的都沒(méi)有修改。出現(xiàn)以下錯(cuò)誤:
arm-none-linux-gnueabi-ld: warning: library search path "/usr/local/lib" is unsafe for cross-compilation
arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.so when searching for -lfreetype
arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.a when searching for -lfreetype
arm-none-linux-gnueabi-ld: cannot find -lfreetype
分析原因是:鏈接的這些庫(kù)文件都是在PC編譯器下編譯出來(lái)的,現(xiàn)在把它們和用arm-none-linux-gnueabi-gcc編譯出來(lái)的文件做鏈接,當(dāng)然會(huì)出錯(cuò)。
解決方法:這些庫(kù)重新用arm-gcc重新編譯生成相應(yīng)的庫(kù)。
下面使用是重新編譯庫(kù)文件的過(guò)程:
重新編譯freetype
根據(jù)交叉編譯的文檔,我創(chuàng)建了一個(gè)文件夾/usr/local/arm-linux來(lái)存放編譯后的庫(kù)文件。執(zhí)行:
./configure –host=arm-none-linux-gnueabi –prefix=/usr/local/arm-linux
注意:host的參數(shù)應(yīng)該是交叉編譯環(huán)境的前綴。
另外,freetype自動(dòng)生成的include文件夾有點(diǎn)小問(wèn)題,編譯完成后的include目錄結(jié)構(gòu)是/include/ft2build.h和
/include/freetype2/freetype/***.h如果直接使用會(huì)出現(xiàn)頭文件找不到的問(wèn)題,這里涉及到freetype的一個(gè)小技巧:使用freetype時(shí)只需要包含ft2build.h這一個(gè)頭文件即可,因?yàn)閒t2build.h里面會(huì)自動(dòng)包含其他需要的頭文件。而ft2build.h中的包含其他頭文件的路徑是/freetype/***.h,顯然找不到相應(yīng)的頭文件。我們把freetype2中的freetype文件整個(gè)拷貝到include目錄下,然后把freetype2刪除即可。
原目錄結(jié)構(gòu):
…/include/freetype2/freetype/***.h
…/include/ft2build.h
修改以后是:
…/include/freetype/***.h
…/include/ft2build.h
如果安裝完成后直接就是后面這個(gè)目錄結(jié)構(gòu)就不用修改了?;蛘咴诰幾g時(shí)直接使用-I再加一個(gè)頭文件的目錄。
-I/…/include/freetype2
使用arm編譯器和使用pc上的編譯器編譯過(guò)程差不多,需要注意的是我們需要重新指定路徑以免把原來(lái)的庫(kù)文件覆蓋掉。
解決上面的問(wèn)題之后,再次編譯,出現(xiàn)以下錯(cuò)誤:
/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include/sys/types.h:62: error: conflicting types for ‘dev_t’
/usr/local/arm-2009q1/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/types.h:13: error: previous declaration of ‘dev_t’ was here
開(kāi)始以為是編譯器自動(dòng)尋找types.h文件然后自動(dòng)包含進(jìn)來(lái)了,后來(lái)所有的都頭文件刪除,然后每加一個(gè)頭文件進(jìn)來(lái)就編譯看看是否出現(xiàn)錯(cuò)誤,后來(lái)發(fā)現(xiàn)這個(gè)我的交叉編譯器對(duì)于某些頭文件的使用順序有要求。例如:
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/fb.h>
#include <fcntl.h>
第一種編譯沒(méi)有問(wèn)題,第二種會(huì)出現(xiàn)上面的錯(cuò)誤。而這兩種寫(xiě)法在PC的gcc上都沒(méi)有錯(cuò)誤。
我的交叉編譯器版本:gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)
感覺(jué)這個(gè)問(wèn)題是由于pc上的gcc和交叉編譯使用的gcc的行為不同才導(dǎo)致的。
arm-none-linux-gnueabi-ld main.o es_run_file.o es_fbctl.o es_time.o es_sql.o es_fbio.o es_dao.o es_utf8.o es_copy.o es_font.o -o main -L/usr/local/arm-linux/lib -lfreetype -lpthread -lsqlite3 -lncurses
arm-none-linux-gnueabi-ld: warning: cannot find entry symbol _start; defaulting to 00009050
es_copy.o: In function `file_exist’:
/root/work/es_copy.c:32: undefined reference to `stat’
最后一個(gè)錯(cuò)誤是找不到stat,我把es_copy.c文件單獨(dú)拿出來(lái)修改以后編譯:
arm-none-linux-gnueabi-gcc es_copy.c
沒(méi)有錯(cuò)誤。把Makefile里的連接器也改成arm-none-linux-gnueabi-gcc,以上兩個(gè)問(wèn)題都消失了。這個(gè)問(wèn)題在gcc和arm-none-linux-gnueabi-gcc這兩種編譯器中都存在,應(yīng)該鏈接時(shí)ld的參數(shù)設(shè)置不對(duì),具體怎樣設(shè)置還是沒(méi)有找到。
1.交叉編譯并安裝使用到的共享庫(kù)。
2.交叉編譯源程序。
3.調(diào)試
聯(lián)系客服