4、移植qt
教程涉及的資料:
1、交叉編譯器
arm-linux-gcc-4.4.3.tar.gz .鏈接:http://pan.baidu.com/s/1nvJF8ud 密碼:oi57
2、針對于 JZ2440 的內(nèi)核補丁以及源碼
linux-2.6.22.6.tar.bz2 .鏈接:http://pan.baidu.com/s/1gf0oZn1 密碼:jrp6
linux-2.6.22.6_jz2440.patch 鏈接:http://pan.baidu.com/s/1c1CWgTE 密碼:uwuu
4.3寸LCD_mach-smdk2440.c 鏈接:http://pan.baidu.com/s/1boZsKwf 密碼:1xml
3、busybox
busybox-1.22.1.tar.bz2 .鏈接:http://pan.baidu.com/s/1cee6CI .密碼:lv81
4、tslib .
tslib-1.4.tar.gz
5、qt5.6 源碼 鏈接:http://pan.baidu.com/s/1jINj3IQ 密碼:6kkc
qt-everywhere-opensource-src-5.6.0.tar.gz 鏈接:http://pan.baidu.com/s/1kVnV9oN 密碼:r7cm
一、更換交叉編譯器
首先,將下載好的文件全部放在 /work 目錄下
1、解壓交叉編譯器
sudo tar zxvf arm-linux-gcc-4.4.3.tar.gz -C / #展開在根目錄
ls /opt/FriendlyARM/toolschain/4.4.3/bin #檢查是否生成了編譯目錄
2、設(shè)置環(huán)境變量
sudo vi /etc/environment
將現(xiàn)在原有的交叉編譯器路徑替換為我們新解壓的交叉編譯器,舉例:
后期測試時我發(fā)現(xiàn)這里是有問題的,由于我的安裝目錄都指定的是 usr 目錄,需要 root 權(quán)限,然而在 environment 中設(shè)置的環(huán)境變量導(dǎo)致使用 root 權(quán)限 make install 過程中出現(xiàn)了個別的 command not found ,于是我將環(huán)境變量放到了 /etc/profile 中,這個文件是對所有用戶生效的。至于environment 百度了一下是系統(tǒng)環(huán)境變量按說應(yīng)該沒問題,但是的確出現(xiàn)了問題。索性還是大家還是直接搞到 profile 中吧。
3、重啟虛擬機
4、檢查是否更換成功arm-linux-gcc -v
如圖,更換完畢,我們的編譯器就變?yōu)?4.4.3 版本了。
二、重新編譯內(nèi)核
如果你不是jz2440也沒關(guān)系,使用你曾經(jīng)移植好的內(nèi)核,重新編譯即可,注意內(nèi)核需要開啟EABI的支持,如果你是jz2440,按照下面的步驟操作即可。
1、解壓
tar jxvf linux-2.6.22.6.tar.bz2
2、打補丁
cd linux-2.6.22.6
patch -p1 < ../linux-2.6.22.6_jz2440.patch
如果你是 4.3 寸的 JZ2440 ,替換 LCD 驅(qū)動,3.5寸跳過此步
mv ../4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c
3、配置內(nèi)核支持 EABI
make menuconfig
kernel features->
<*>use the arm eabi to .... //選中這一項
4、修改 makefile ,不改的話 4.4.3 編譯器編譯時會報錯
vi Makefile
由于友善在制作這款交叉編譯工具時指定了最低內(nèi)核版本(2.6.32.2)的限制,所以我們?nèi)绻患有薷闹苯泳幾g啟動內(nèi)核時會出現(xiàn) kernel too old 的錯誤信息,無法啟動。這里使用一個投機取巧的辦法,強制對 2.6.22.6 內(nèi)核的版本進行修改,更改內(nèi)核版本號對內(nèi)核編譯是有影響的,真正移植的時候還是建議選擇高版本內(nèi)核。
Makefile 最開始的地方就是版本號:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 22
EXTRAVERSION = .6
中的 SUBLEVEL = 22 改為 SUBLEVEL = 32
//找到一下幾行 ,這里是因為 4.4.3 的編譯器不支持 gdwarf2 這個選項
ifdef CONFIG_DEBUG_INFO
CFLAGS += -g
AFLAGS += -gdwarf2
endif
//注釋掉 AFLAGS += -gdwarf2
5、編譯
make uImage -j4
編譯完的uImage 在 /arch/arm/boot 目錄下
三、制作文件系統(tǒng)
1、解壓
tar jxvf busybox-1.22.1.tar.bz2
2、配置
make menuconfig
Busybox Settings ->
general configuration ->
[*] don't use /usr //選中它 否則會破壞虛擬機
build options->
cross comliler prefix = arm-linux- //選擇交叉編譯工具
installtion options->
busybox installation prefix = /work/my_rootfs //指定安裝路徑
3、編譯&安裝
mkdir -p /work/my_rootfs //安裝路徑
make
make install
cd /work/my_rootfs
ls //查看是否安裝成功
編譯安裝完畢之后,我們的文件系統(tǒng)就生成在 /work/my_roofs 目錄下了
4、創(chuàng)建 /etc/inittab
mkdir -p /work/my_rootfs/etc
vi /work/my_rootfs/etc/inittab
# /etc/inittab
# 啟動腳本/etc/init.d/rcS
::sysinit:/etc/init.d/rcS
# 啟動 shell
::askfirst:-/bin/sh
# 重啟關(guān)機前 卸載文件系統(tǒng)
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、創(chuàng)建 /etc/init.d/rcS
mkdir -p /work/my_rootfs/etc/init.d
vi /work/my_rootfs/etc/init.d/rcS
# 這是一個腳本文件,用/bin/sh解析
#!/bin/sh
# 掛載文件系統(tǒng)
mount -a
# 使用內(nèi)存文件系統(tǒng)
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# 設(shè)置IP
#/sbin/ifconfig eth0 192.168.1.17 #nfs不需要
# 掛載 /etc/fstab 中的文件系統(tǒng)
mount -a
exec /etc/rc.local
6、創(chuàng)建rc.local
vi /work/my_rootfs/etc/rc.local
#!/bin/sh
. /etc/profile //注意.后邊有個空格!
7、創(chuàng)建/etc/fstab
vi /work/my_rootfs/etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
8、構(gòu)建 /dev 目錄
mkdir -p /work/my_rootfs/dev
cd /work/my_rootfs/dev
sudo mknod console c 5 1
sudo mknod null c 1 3
9、創(chuàng)建其它目錄
mkdir proc mnt tmp sys root usr
10、拷貝Lib
cd /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib
cp *.so* /work/my_rootfs/lib -d
cd /opt/FriendlyARM/toolschain/4.4.3/lib
cp *.so* /work/my_rootfs/lib -d
四、移植 tslib
1、解壓&配置&編譯
如果不是使用的韋老大的虛擬機可能還需要安裝一下幾個包 autoconf automake libtool
#sudo apt-get install autoconf automake libtool
tar zxvf tslib-1.4.tar.gz
sudo mkdir -p /usr/local/tslib
cd tslib
./autogen.sh
./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ -prefix=/usr/local/tslib
make
sudo make install
如果編譯過程中遇到 undefined reference to 'rpl_malloc',前面配置完成之后修改 config.h.in 文件,注釋掉文件最后的 #undef malloc ,重新 make 即可。
安裝完成之后,tslib 就安裝在虛擬機 /usr/local/tslib 目錄下
2、更改 tslib 配置文件
cd /usr/local/tslib/etc/
sudo vi ts.conf
去掉# module_raw input 前面的 “#” 和空格
3、將制作好的 tslib 移動到我們制作的文件系統(tǒng)
cd /usr/local
sudo tar zcvf tslib.tar.gz tslib
mkdir -p /work/my_rootfs/usr/local
cp tslib.tar.gz /work/my_rootfs/usr/local
tar zxvf tslib.tar.gz
rm tslib.tar.gz
4、添加 tslib 環(huán)境變量
vi /work/my_rootfs/etc/profile
#!/bin/sh
export T_ROOT=/usr/local/tslib
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
此時,tslib 就已經(jīng)移植好了,你可以掛載 nfs 文件系統(tǒng)啟動,cd /usr/local/tslib/bin
./ts_test 來測試
按照教程制作應(yīng)該沒有問題,我在使用高版本內(nèi)核的時候遇到“selected device is not a touchscreen I understand”錯誤,百度了一下,是由于內(nèi)核和編譯器的一個宏定義不一致導(dǎo)致的,vi include/Linux/input.h EV_VERSION 為 0x0100000 ,從新編譯內(nèi)核特別是觸摸驅(qū)動。
五、移植 qt5.6
1、解壓
tar zxvf qt-everywhere-opensource-src-5.6.0.tar
2、修改編譯配置
cd /work/qt-everywhere-opensource-src-5.6.0/qtbase/mkspecs/linux-arm-gnueabi-g++
vi qmake.conf
針對于 2440 增加:
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t
march 指的 cpu 架構(gòu),針對 2440 來說是 armv4t
mtune 指的 cpu 名字,針對 2440 來說是 arm920t
如果你是 A8 的板子 ,可以參考下邊的配置
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a8
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a8
如果你是 A9 的板子 ,可以參考下邊的配置
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a9
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a9
將以下部分
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabi-gcc
QMAKE_CXX = arm-linux-gnueabi-g++
QMAKE_LINK = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy
QMAKE_NM = arm-linux-gnueabi-nm -P
QMAKE_STRIP = arm-linux-gnueabi-strip
修改為:-lts 是指在鏈接時鏈接 tslib 庫
# modifications to g++.conf
QMAKE_CC = arm-none-linux-gnueabi-gcc -lts
QMAKE_CXX = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_NM = arm-none-linux-gnueabi-nm -P
QMAKE_STRIP = arm-none-linux-gnueabi-strip
3、配置編譯
sudo mkdir -p /usr/local/Qt5.6
cd ../../../
./configure -prefix /usr/local/Qt5.6 \
-opensource \
-release \
-confirm-license \
-xplatform linux-arm-gnueabi-g++ \
-shared \
-qt-zlib \
-no-gif \
-qt-libjpeg \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-no-dbus \
-no-rpath \
-no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 \
-no-avx \
-no-openssl \
-nomake tools \
-qreal float \
-qt-libpng \
-tslib \
-nomake examples \
-I /usr/local/tslib/include \
-L /usr/local/tslib/lib
make -j4
sudo make install
如果使用的不是韋老大的虛擬機編譯過程中可能報關(guān)于libxcb的錯誤,查看 qtbase/src/plugins/platforms/xcb 底下的 readme 安裝相應(yīng)的庫就可以了。
4、將移植好的 qt 打包到開發(fā)板
cd /usr/local
sudo tar zcvf Qt5.6.tar.gz Qt5.6
cp Qt5.6.tar.gz /work/my_rootfs/usr/local/
tar zxvf Qt5.6.tar.gz
rm Qt5.6.tar.gz
rm -r doc include bin mkspecs qml translations
5、設(shè)置qt相關(guān)的環(huán)境變量
此部分可以參考qt官方問文檔:http://doc.qt.io/qt-5/embedded-linux.html ,這我這僅僅是設(shè)置支持了觸摸屏,你可以參考官方設(shè)置支持鍵盤,鼠標(biāo)等等。
在文件系統(tǒng) /etc/profile 里添加
export QTEDIR=/usr/local/Qt5.6
export LD_LIBRARY_PATH=/usr/local/Qt5.6/lib:$LD_LIBRARY_PATH
export QT_QPA_GENERIC_PLUGINS=tslib
export QT_QPA_FONTDIR=$QTEDIR/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:mmSize=480x272:offset=0x0:tty=/dev/tty1
export QT_QPA_FB_TSLIB=1
紅色部分請根據(jù)自己的開發(fā)板進行修改,我手頭的開發(fā)板是 3.5 寸 320*240 的 LCD,JZ2440 V3 用上面的參數(shù)即可。
此時,qt 已經(jīng)移植完畢,你可以打包放入你的 nfs 目錄啟動進行測試了,至于制作 yaffs2 jffs2 等文件系統(tǒng)請參考:http://blog.csdn.net/lizuobin2/article/details/52589215 ,qt庫比較大,燒錄的時候可能比較困難,可以先將QT去除,打包成文件系統(tǒng)大約之后20M不到,燒錄到開發(fā)板之后,啟動內(nèi)核,通過nfs tftp等工具,再將打包好的Qt傳到板子上展開即可。
六、測試Qt應(yīng)用程序
我個人習(xí)慣先用 windows 版本的 qt 寫好程序,調(diào)試沒問題之后直接拿到虛擬機上編譯,windows 版本的 qt 安裝非常簡單,就跟安裝個QQ一樣毫不費力,這里就不再贅述了。
將windows下編輯好的源碼拷貝到虛擬機上,切換到源碼目錄
/usr/local/Qt5.6/bin/qmake
make
即可生成可執(zhí)行文件,拿到開發(fā)板測試即可。
嫌費事的話,將 qmake 添加到環(huán)境變量里。
在測試過程中我發(fā)現(xiàn)程序跑起來沒問題,但是有以下兩條錯誤信息:
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
大概是缺少 libiconv
下載 鏈接:http://pan.baidu.com/s/1c22xb4O 密碼:pbld
mkdir -p /usr/local/libiconv
./configure --host=arm-none-linux-gnueabi --prefix=/usr/local/libiconv CC=arm-none-linux-gnueabi-gcc LDFLAGS="-L/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/lib" --enable-static
make
sudo make install
把安裝目錄/lib 下的 preloadable_libiconv.so 文件系統(tǒng)的 /lib 下, 在 /etc/profile 中添加
export LD_PRELOAD=/lib/preloadable_libiconv.so
7、使Qt支持中文
在測試過程中很悲劇的發(fā)現(xiàn)移植好的qt不支持中文,強大度娘給了我答案。
下載字庫 鏈接:http://pan.baidu.com/s/1bp9QFQv 密碼:2u81
將DroidSansFallback.ttf 放到文件系統(tǒng) /usr/local/Qt5.6/lib/fonts 目錄下,雖然Qt自帶了很多字庫了,但是都沒有中文的。
然后在使用qt creator 開發(fā)qt應(yīng)用程序時,在項目中添加
QT += gui
包含頭文件 #include <QFontDatabase>
代碼中設(shè)置使用的字體。
int id = QFontDatabase::addApplicationFont("/usr/local/Qt5.6/lib/fonts/DroidSansFallback.ttf");
QString msyh = QFontDatabase::applicationFontFamilies (id).at(0);
QFont font(msyh,10);
font.setPointSize(20);
this->setFont(font);
如果你想讓你的開發(fā)板支持 ssh 請參考:
http://blog.csdn.net/lizuobin2/article/details/52664339
如果你想讓你的開發(fā)板支持串口(rz)傳輸文件請參考:
http://blog.csdn.net/lizuobin2/article/details/52601617
如果你想讓你的開發(fā)板想虛擬機一樣在命令行顯示用戶名請參考:
http://blog.csdn.net/lizuobin2/article/details/52664657
嵌入式QT相關(guān)的設(shè)計開發(fā)需求,請聯(lián)系我QQ:271526143