qt移植
QT 移植
1.交叉编译工具的安装和配置
1.1 首先需要明白,在linux下编译的可执行文件在arm下是不能跑的,所以我们需要一个交叉编译工具,这个工具是为了在虚拟机中的linux下通过arm-linux-g++指令编译成的程序,而这个程序才能在arm板上跑起来!
1.2 下载一个EABI-4.3.3_EmbedSky_20100610.tar.bz2(这是一个已经弄好的程序),解压后只需要把bin文件下的可执行程序配置进环境变量中即可
1.3 一般的,在/usr/local/创建一个arm-linux-compiler文件夹,解压到该文件夹下,然后把/usr/local/arm-linux-compiler/opt/EmbedSky/4.3.3/bin,该路径配置进/etc/profile文件中即可
1.4 vim /etc/profile 在最后一行加上 export PATH=/usr/local/arm-linux-compiler/opt/EmbedSky/4.3.3/bin:$APTH 执行命令source /etc/profile , 此时生效!(永久生效), $PATH查看是否生效,没有生效,PATH=.....:$PATH临时配置也行,或者重启
1.5 在命令界面下,任意路径下执行 arm-linux-gcc ,若有此命令,恭喜你,第一步已经成功!
到这一步,所写得c程序,在通过arm-linux-gcc命令编译过后的程序,传送到arm板上,已经可以运行了!
2.tslib的编译,安装
2.1 tslib 这玩意用来干啥?arm有触控屏吧?要能点,能动吧?就是用来干这事的!
2.2 下载一个 tslib-1.4.tar.gz , 解压到opt下.(在 http://blog.chinaunix.net/u2/75270/showart_1793535.html 有tslib 1.4的下载)
2.3 进入/opt/tslib目录下,执行.autogen.sh脚本(这玩意是用来生成配置文件的)
2.4 运行配置文件,设置安装路径 ./configure --prefix=/usr/local/tslib --host=arm-linux ac_cv_func_malloc_0_nonnull=yes(--prefix=/usr/local/tslib:安装路径参数)
2.5
修改tests目录下的ts_calibrate.c
在判断if (perform_calibration (&cal)) 中
if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {
cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);
} else {
cal_fd =
open ("/etc/pointercal", O_CREAT | O_RDWR, 0777);
}
2.6 返回目录tslib, 执行 make 命令(编译); 再执行 make install 命令(安装)
2.7 最后一步将虚拟机中linux系统下的/usr/local/ 目录中的tslib中的所有东西tar 打包,发送到arm板上的linux系统中相应的文件夹下,即/usr/local,解压!(正常情况下,这样就差不多了,但为了双重保险)
把tslib 中的 bin etc lib include 文件夹全部复制到 arm板中的linux系统的对应文件下bin->/bin etc->/etc lib->/usr/lib include->/usr/include(没有则手动创建)(复制文件夹,别给我用cp指令,里面有动态链接库,tar后再cp,然后再解压开,否则后面步骤会出现各种问题)
2.8 至此第二步骤已经完成!不过别急,重头戏在后面。。。
3.Qt arm 板的编译和安装(装在虚拟机中的linux)
3.1 既然是qt移植,没个qt软件还搞毛线!
3.2 下载一个qt-everywhere-opensource-src-4.7.4.tar.gz ,解压到/opt文件夹下,到/opt/qt-everywhere-opensource-src-4.7.4/mkspecs/qws/linux-arm-g++下查看是否有qmake.conf 以及qplatformdefs.h,如果没有从别的目录拷贝过来(一般都有,除非你命苦)
3.3
查看qmake.conf 文件内容,是否有
QMAKE_CC = arm-linux-gcc
QMAKE_CXX = arm-linux-g++
QMAKE_LINK = arm-linux-g++
QMAKE_LINK_SHLIB = arm-linux-g++
你的qt程序是要移植到arm板上的,所以明白这玩意的意义了吧。
3.4 最后就是编写脚本文件 gedit myconfig.sh ./myconfig.sh 然后老规矩 make (这一步需要花大量的时间,别急慢慢等) make install
4.测试QT arm 开发环境
4.1 配置环境变量
export ARMQDIR=/usr/local/Trolltech/QtEmbedded-4.7.0-arm
export PATH=$ARMQDIR/bin:$PATH
export MANPATH=$ARMQDIR/man:$MANPATH
export LD_LIBRARY_PATH=$ARMQDIR/LIB:$LD_LIBRARY_PATH
4.2
执行qmake -v, 显示以下信息
QMake version 2.01a
Using Qt version 4.7.4 in /usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib
执行which qmake, 显示
/usr/local/Trolltech/QtEmbedded-4.7.0-arm/bin/qmake
说明环境变量配置成功!
4.3
编写一个hello world.cpp 程序 c++程序
#include <QApplication>
#include <QLabel>
int main(int
argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}
4.4 在当前目录下
4.4.1执行qmake -project;qmake -makefile
生成Makefile
4.4.2 执行make 生成helloworld 程序
File helloworld 命令查看文件属性 可看见 ARM关键字。。
至此,虚拟机中的linux的开发环境已经搭完,也就是说,编译后的文件是可以在arm板上跑的,如果你的程序可以在虚拟机中的linux上跑,那么恭喜你,上面哪一步出错了~~~~
5.arm上的linux
5.1 前面的步骤,完成的是vm下linux的搭建,那么想vm下linux生成的qt程序能在arm上实际跑起来,arm中的linux也需要搭建一下环境,简单的说,就是环境变量的配置,所需运行库的拷贝
5.2 首先在开发板的linux 系统下建立同名的目录,以便拷贝, /usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib
5.3 把虚拟机下的linux的/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib目录下的文件全部拷贝过去
5.4 把虚拟机下的linux的/usr/local/tslib 所有的文件拷贝到开发板上(同一个路径下)在前面的第二步,已经完成!
5.5.设置环境变量 vi setqtenv
export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.0-arm
export T_ROOT=/usr/local/tslib
export PATH=$T_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/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 TSLIB_CALIBFILE=/etc/pointercal
export QWS_KEYBOARD=USB:/dev/input/event1
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
执行 source setqtenv
5.6 然后把 libstdc++.so.6.0.9 和libz.so.1.2.3 传送到开发板的 /usr/local/lib 目录下(这俩个文件分别在vm linux下的/usr/lib /lib 文件夹下)
5.7
在开发板运行触摸屏校正:
(1) 在运行触摸屏校正之前,需要设置一些环境变量,以下是我的开发板的 /etc/profile 文件的内容:
设置环境变量 vi profile
vi profile
# Ash profile
# vim: syntax=sh
# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
export set HOME=/root
#export set QTDIR=/opt/PDA
#export set QPEDIR=/opt/PDA
export set QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.0-arm
export set QPEDIR=/usr/local/tslib
export set QWS_DISPLAY="LinuxFB:/dev/fb0"
export set QWS_DISPLAY="LinuxFB:mmWidth130:mmHeight100:0"
export set QWS_KEYBOARD="TTY:/dev/tty1"
if [ -f /sys/devices/virtual/input/input1/uevent ] ; then
export set TSLIB_TSDEVICE=/dev/event1
export set TSLIB_CALIBFILE=/etc/pointercal
export set TSLIB_CONFFILE=/etc/ts.conf
export set TSLIB_PLUGINDIR=/lib/ts
export set QWS_MOUSE_PROTO="TSLIB:/dev/event1 MouseMan:/dev/"
else
export set QWS_MOUSE_PROTO="MouseMan:/dev/mice"
fi
#export set QT_PLUGIN_PATH=$QTDIR/plugins/
export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH
export set QT_QWS_FONTDIR=$QTDIR/lib/fonts/
export set PATH=$QPEDIR/bin:$PATH
#export set LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/plugins/imageformats:$P
export set LD_LIBRARY_PATH=$QPEDIR/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export set TSLIB_TSDEVICE=/dev/event1
export set TSLIB_CALIBFILE=/etc/pointercal
export set TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export set TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
source profile
5.8 运行触摸屏校正:
# cd /usr/local/tslib/bin
# ./ts_calibrate
报错
“No raw modules loaded.”, 原因是缺省时,/usr/local/tslib/etc/ts.conf 中所有的 raw module 都注释掉了,打开第一项 “module_raw input” 即可 。
重新运行,应该成功;点击屏幕上出现的需要校正的“+”,校正结果存放在 ,/usr/local/tslib/etc/pointercal
文件中。
5.9 运行QT测试程序
./helloworld -qws
至此,大工告成!!!!(期间会遇到各种问题,不罗列出来,祝好运~~)