QT4.6.3在TQ2440上的移植
1. 需要的工具和开发环境
交叉编译工具:arm-linux-gcc-4.4.3-20100728.tar.gz
Qt包:qt-everywhere-opensource-src-4.6.3.tar.gz
触摸屏程序包:tslib-1.4.tar.gz
开发环境:虚拟机ubuntu9.10
2. 安装交叉编译工具
Step1:将linux交叉编译工具包arm-linux-gcc-4.4.3-20100728.tar.gz 复制到宿主机的linux系统某个目录下,并cd进入该目录,然后解压安装,指令如下:
tar -zxvf arm-linux-gcc-4.4.3-20100728.tar.gz –C /
注意:C 后面有个空格,并且C 是大写的。执行此指令后,将编译器安装到
/opt/FriendlyARM/toolschain/4.4.3目录中。
Step2:将交叉编译器路劲加入到系统环境变量中,运行命令
sudo gedit /root/.bashrc 编辑/root/.bashrc文件,在其最后面加入如下一行:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
保存/root/.bashrc文件并退出,然后重新登录系统即可完成配置。判断arm-linux安装是否成功,可在系统重新登陆后在终端输入arm-linux-gcc –v,若有出现对应的版本号信息,且为4.4.3,即说明安装成功。
3. 交叉编译触摸屏程序
#tar –zxvf tslib-1.4.tar.gz
#cd ./tslib
#./autogen.sh
#./configure --prefix=/usr/local/tslib --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
#make
#make install
这样以后可以看到/usr/local/tslib下有了库文件,移植时会用到。
ps : host选项中malloc后面接着的是数字0,不是小写字母o。
4. 编译Qt库
解压软件
#mkdir /opt/Qt-4.6.3-arm
#tar -xzvf qt-everywhere-opensource-src-4.6.3.tar.gz -C /opt/Qt-4.6.3-arm/
#cd /opt/Qt-4.6.3-arm/
配置参数
# ./configure -prefix /usr/local/Trolltech/QtEmbedded-4.6.3-arm -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-webkit -no-qvfb -no-phonon -no-nis -no-opengl -no-cups -no-glib -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -nomake docs -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
有的参考资料中的参数中加入了-depths 16,18,24 我第一次也加了这个参数到板子上运行时出错 screen depth 32 not supported! 可以在这里加入参数32,或者-depths all 我是直接删除了这句。
配置出错The tslib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR and QMAKE_LIBDIR in
/home/ian/lib/qt-everywhere-opensource-src-4.7.0/mkspecs/qws/linux-arm-g++.
查看configure脚本
for mouse in ${CFG_MOUSE_ON} ${CFG_MOUSE_PLUGIN}; do
if [ "${mouse}" = "tslib" ] && [ "${CFG_CONFIGURE_EXIT_ON_ERROR}" = "yes" ]; then
"$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/tslib "tslib" $L_FLAGS $I_FLAGS $l_FLAGS
if [ $? != "0" ]; then
echo "The tslib functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR and QMAKE_LIBDIR in"
echo " ${XQMAKESPEC}."
exit 1
找不到库和编译器都会报错
解决办法:打开Qt目录下mkspecs/qws/linux-arm-g++/qmake.conf文件,
添加下面两句:
QMAKE_LIBDIR=/usr/local/tslib/lib
QMAKE_INCDIR=/usr/local/tslib/include
修改下面的变量地址:
# modifications to g++.conf
QMAKE_CC =/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-gcc -lts
QMAKE_CXX =/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-g++ -lts
QMAKE_LINK = /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-g++ -lts
QMAKE_LINK_SHLIB = /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-g++ -lts
# modifications to linux.conf
QMAKE_AR = /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-ar cqs
QMAKE_OBJCOPY = /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-objcopy
QMAKE_STRIP = /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-strip
重新配置成功。
#Make
#make install。
5. 库的移植
当Qt库编译好后,将会在目录/usr/local/Trolltech/QtEmbedded-4.6.3-arm下生成文件,将该目录下的lib目录复制到根文件系统的/usr/local/Trolltech/QtEmbedded-4.6.3-arm目录下。
将tslib目录复制到根文件系统的根目录下。
# mkdir /usr/local/Trolltech/QtEmbedded-4.6.3-arm
# mkdir /tslib
修改 /tslib/etc/ts.conf第1行(去掉#号和第一个空格):
# module_raw input
改为:
module_raw input
配置用到的变量#vi /etc/profile/
在文件末尾加上下面的环境变量:
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.6.3-arm
export T_ROOT=/tslib
export PATH=$QTDIR/bin:$PATH
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export QWS_MOUSE_PROTO=tslib:/dev/event0
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
#source /etc/prifile使环境变量生效
Qt程序的编译和移植
测试程序,新建文件hello.cpp输入下面代码:
#include <qapplication>
#include <qpushbutton>
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QPushButton b("Hello World !");
b.show();
QObject::connect(&b,SIGNAL(clicked()),&app,SLOT(quit()));
return app.exec();
}
刚开始我的头文件写的是QApplication,QPushButton这两个,编译失败,换成小写就可以了,我先是用qmake编译生成的是pc平台的程序(我在pc也装了编译环境)修改了ARM的qmake环境变量还是没用,后来我直接用绝对路径去编译,生成文件
使用qmake交叉编译程序
/usr/local/Trolltech/QtEmbedded-4.6.3-arm/bin/qmake -project
/usr/local/Trolltech/QtEmbedded-4.6.3-arm/bin/qmake
Make
生成执行程序复制到开发板
执行./hello -qws出错
./hello: /lib/libc.so.6: version `GLIBC_2.9' not found (required by
/usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib/libQtGui.so.4)
./hello: /lib/libc.so.6: version `GLIBC_2.9' not found (required by
/usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib/libQtCore.so.4)
缺少编译器库文件,将编译器的库文件复制到开发板的lib目录
Cp -rfd /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/*so*到板子的lib目录。重新执行./hello -qws,终于在TQ2440上可以执行了。
6. 开机运行程序
创建脚本run.sh输入:
#! /bin/sh
export QTDIR=/usr/local/Trolltech/QtEmbedded-4.6.3-arm
export T_ROOT=/tslib
export PATH=$QTDIR/bin:$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_MOUSE_PROTO=tslib:/dev/input/event0
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
export QWS_KEYBOARD=TTY:/dev/tty1
/tmp/hello -qws
配置开发板的启动文件
/etc/init.d/rcS
加入/usr/local/run.sh &
结束!