1. 程式人生 > >對於嵌入式交叉編譯總結

對於嵌入式交叉編譯總結

這幾天終於搞定了老師專案裡我負責的部分,主要是做一個影象採集的手持端,我選用了JZ2440。
從移植核心、製作檔案系統、Qt移植總結下來發現在對於程式碼的交叉編譯必須保證編譯平臺的一致性。對於s3c2440來說是armv4t,所以當我們編譯出來程式必須要是

執行 arm-linux-readelf libjpeg.so.62.0.0 -A (libjpeg.so.62.0.0 為我交叉編譯出來的)

這裡寫圖片描述
這裡的Tag_CPU_arch: v4T 很重要 、我的工具鏈arm-none-linux-gnueabi-(4.3.2)預設編譯出來的程式為V5 平臺的,由於我又是新手,開始時給我帶來很多困擾

後來我成功搭建好busybox時Qt程式老是出現非法指令問題
我查看了我生成的Qt程式,發現為V5,這也不難解釋Illegal instruction錯誤
這裡寫圖片描述

開始時我走了彎路,我在我寫的Qt程式里加入了

這裡寫圖片描述

後來發現還是編譯出來為V5,我又嘗試在Makefile中加入march指定,發現還是不行,後來突然發現我編譯出來的Qt連結庫全是V5平臺的,怪不得編譯出來的程式也是V5,什麼樣的爹什麼樣的兒子嘛。於是我又開始程式交叉編譯armv4t的qt4.7 。這這間經歷的坑我就不多說了,直接貼上我的檔案

./configure -opensource -embedded armv4t -xplatform qws/linux-arm-g++ -no-webkit -nomake demos -nomake examples -qt-libtiff -qt-libmng -qt-libjpeg -qt-mouse-tslib -qt-mouse-pc -qt-gfx-transformed -no-mouse-linuxtp -prefix /opt/qt-4.7.1 -I /usr/local/tslib/include -L /usr/local/tslib/lib

加粗的這一句很重要,直接決定了編譯出來是armv4t還是armv5
(預設V5)。最後的-I -L根據自己情況寫

編譯libtools
./configure CC=arm-linux-gcc-yin –host=arm –prefix=/opt/jpeg/libtool-release

編譯jpeg-6b
./configure CC=arm-linux-gcc-yin –prefix=/opt/jpeg/jpeg-6b-release –enable-shared –enable-static –host=arm

編譯tslib
CFLAGS=-march=armv4t ./configure –host=arm-linux –cache-file=arm-linux.cache -prefix=/usr/local/tslib ac_cv_func_malloc_0_nonnull=yes

這裡寫圖片描述

arm-linux-gcc-yin 是我自己做的指令碼。

最後一句:最重要的是統一