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

至此,大工告成!!!!(期间会遇到各种问题,不罗列出来,祝好运~~)

 

posted @ 2017-07-22 22:11  helloc14  阅读(1083)  评论(0编辑  收藏  举报