这是自己第一次写博客,因为在编译的过程中遇到了很多挫折,出现了一个小的问题,查看了很多帖子,博客都没能解决,最后经过对源码的分析,各种打印跟踪,找到了原因,所以分享给大家,希望对大家有所帮助!!在此过程中也参照了很多其他大神的资料,在此非常感谢。

===========================================================================================

开发平台:32位Ubuntu12.04

总的结构是:先编译tslib,再编译QT5.7,最后一起移植到开发板;

使用的交叉编译工具链:arm-none-linux-gnueabi(根据自己的需要)

===========================================================================================

一、tslib库的编译:

1、在tslib官网上下载tslib-1.4的源码:tslib-1.4.tar.gz

2、cd /home/ubuntu (ubuntu是我开发板的用户名称)

3、将tslib-1.4.tar.gz放在/home/ubuntu下面;(方法:1、可以通过共享文件;2、也可以直接从Windows中直接拖进来;建议使用共享文件)

4、tar -zxvf tslib-1.4.tar.gz

5、cd tslib

6、mkdir Arm-tslib (下面会将tslib库安装在这个文件夹)

7、./autogen-clean.sh(注意:每次在编译失败后都要执行,这是清除作用)

8、./autogen.sh 

出现:./autogen.sh:4:autoreconf:not found 错误

9、sudo apt-get install autoconf automake libtool

10、./autogen-clean.sh

11、./autogen.sh

12、./configure   --host=arm-none-linux-gnueabi  ac_cv_func_malloc_0_nonnull=yes 

 --cache-file=arm-linux.cache   -prefix=/home/ubuntu/tslib/Arm-tslib

注意:--host=arm-none-linux-gnueabi(指定交叉工具链,可根据需要修改)

           -prefix=/home/ubuntu/tslib/Arm-tslib(指定安装目录,可根据需要修改

13、/tests/ts_calibrate.c中加入open的第三个参数0777,否则make时会出现错误

即:vim tests/ts_calibrate.c

修改227行和229

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);

}

14、make

15、make install

16、此时可以在Arm-tslib文件中看到4个文件: bin    etc     include     lib  

===========================================================================================

二、QT5.7库的编译:

1、在QT官网上下载QT5.7的源码:qt-everywhere-opensource-src-5.7.0.tar.gz

2、cd /home/ubuntu 

3、mkdir qt5.7

4、将qt-everywhere-opensource-src-5.7.0.tar.gz放在/home/ubuntu/qt5.7下面;

5、cp /home/ubuntu/tslib/Arm-tslib   /home/ubuntu/qt5.7/   -rf (将tslib的库复制一份放在qt5.7下,后面编译QT5.7时,会用到)

6、tar qt-everywhere-opensource-src-5.7.0.tar.gz

7、cd qt-everywhere-opensource-src-5.7.0

8、mkdir Arm-qt(下面会将QT5.7的库安装在这个文件夹)

9、cd  qtbase/mkspecs/linux-arm-gnueabi-g++(进入qtbase/mkspecs/linux-arm-gnueabi-g++目录

10、vim qmake.conf

修改为如下所示:

     MAKEFILE_GENERATOR      = UNIX

        CONFIG                 += incremental

        QMAKE_INCREMENTAL_STYLE = sublib

        

        QT_QPA_DEFAULT_PLATFORM = linux #eglfs

        QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a

        QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a

        

        include(../common/linux.conf)

        include(../common/gcc-base-unix.conf)

        include(../common/g++-unix.conf)

        

        # modifications to g++.conf

        QMAKE_CC                           = arm-none-linux-gnueabi-gcc

        QMAKE_CXX                        = arm-none-linux-gnueabi-g++

        QMAKE_LINK                       = arm-none-linux-gnueabi-g++

        QMAKE_LINK_SHLIB          = arm-none-linux-gnueabi-g++

        

        # 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

        load(qt_config)

注意:其中的arm-none-linux-gnueabi是自己对应的交叉工具

11、cd    /home/ubuntu/qt5.7/qt-everywhere-opensource-src-5.7.0(回到主目录)

12、创建一个shell脚本:vim  autoConfigure.sh

内容如下:    

    #!/bin/sh

            ./configure \

            -v \

            -prefix /home/ubuntu/qt5.7/qt-everywhere-opensource-src-5.7.0/Arm-qt \

            -release \

            -opensource \

            -no-accessibility \

            -make libs \

            -xplatform linux-arm-gnueabi-g++ \

            -optimized-qmake \

            -pch \

            -qt-sql-sqlite \

            -qt-zlib \

            -no-opengl \

            -no-sse2 \

            -no-openssl \

            -no-nis \

            -no-cups \

            -no-glib \

            -no-iconv \

            -no-pkg-config \

            -no-separate-debug-info \

            -skip qtvirtualkeyboard \

            -tslib \

            -I/home/ubuntu/qt5.7/Arm-tslib/include \

            -L/home/ubuntu/qt5.7/Arm-tslib/lib

    exit

注意:

        如果想具体知道为什么这么配置,可以直接在主目录下输入命令:

        ./configure  -help


上述配置中:

       -no-iconv (必须加上这个,否则编译的QT程序没有任何文字显示)

       -prefix /home/ubuntu/qt5.7/qt-everywhere-opensource-src-5.7.0/Arm-qt (指定QT5.7库安装的目录)

      -tslib (表示该QT5.7库有触摸屏tslib插件)

  -I/home/ubuntu/qt5.7/Arm-tslib/include (告诉QT5.7,触摸屏tslib头文件的具体位置)

  -L/home/ubuntu/qt5.7/Arm-tslib/lib(告诉QT5.7,触摸屏tslib库的具体位置)

13、chmod 777  autoConfigure.sh

14、./autoConfigure.sh

15、make (时间比较漫长)

16、make install

17、此时可以在Arm-qt文件中查看是否安装成功;

18、cd Arm-qt/lib

19、 mkdir fonts  (在QT库lib下建立一个文件夹fonts用来装中文字库)

20、将 /usr/shared/fonts/truetype/arphic/下的字库,复制一份到fonts目录下;(这样QT程序才能显示中文)   

===========================================================================================

三、移植(重点介绍,这是我写这篇博客的原因)

说明:此处用到NFS挂载、具体安装可以百度;

            我ubuntu中的挂载目录是/NFS;开发板上的挂载目录是/nfs

1、将上述的Arm-qt 和Arm-tslib 复制一份到/NFS下;

2、在开发板中cp /nfs/Arm-qt /tmp -rf;cp /nfs/Arm-tslib /usr -rf (注意:由于QT5.7库比较大,所以复制的目的地,空间要比较大才行,否则会出错)

3、cd /usr/Arm-tslib/bin

4、./ts_calibrate(可以查看自己是否能够校准;如果可以则表示tslib库的编译成功)

5、vim /etc/profile

在最后添加如下内容:

export QT_ROOT=/tmp/Arm-qt                                

export TSLIB_ROOT=/usr/Arm-tslib                     

export  TSLIB_CONSOLEDEVICE=none           

export  TSLIB_FBDEVICE=/dev/fb0                               

export  TSLIB_TSDEVICE=/dev/input/event0               

export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf                  

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts                      

export  QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0        

export  QT_QPA_FONTDIR=$QT_ROOT/lib/fonts  (此处是指定中文字库目录)             

export  QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins          

export  QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0                  

export  TSLIB_CALIBFILE=/etc/pointercal               

export  QT_PLUGIN_PATH=$QT_ROOT/plugins/              

export  LD_LIBRARY_PATH=$QT_ROOT/lib:$TSLIB_ROOT/lib  

6、source  /etc/profile

7、我按照网上的博客,进入Arm-tslib/etc下面,修改ts.conf如下,其他的都不变

将第二行# module_raw input 前面的空格和#删除          

8、我写了一个QT5.7的小程序test,放到开发板中,执行./test。

大问题出现了:

9、程序能够运行,但是触摸屏没反应;同时显示出

Couldnt load module pthres

ts_config() failed (No such file or directory)

我查看了相关博客都说没有加上export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts 

但是我已经加上了呀?怎么回事呢?

也有博客说tslib库的路径错误、有的说ts.conf中空格没有删除干净......

经过查看很多很多博客,最后都没能解决........

下面是我查找问题的过程:

1、按照网上的博客提示,我都没有什么问题,而显示Couldnt load module pthres;于是我怀疑是不是自己缺少pthres.so库,自己进入Arm-tslib/lib/ts下查看,发现自己的库没有问题;

2、我怀疑是不是自己库交叉编译工具错了?但是我测试了./ts_calibrate程序呀,可以完整的显示;所以库应该没有问题....

3、我分析,tslib库是好的,QT测试小程序test能正常显示,那么出问题就应该是QT和tslib之间的衔接错了..

4、看了自己编译QT时,连接tslib库的目录是-I/home/ubuntu/qt5.7/Arm-tslib/include

-L/home/ubuntu/qt5.7/Arm-tslib/lib,而和我自己移植到开发板上tslib的目录路径不一样,以为是目录的问题,然后进行修改,发现还是没解决......

5、纠结了好久,还是回到原点,对/etc/profile中每一条配置进行分析,翻阅资料,最后还是没解决...

6、好吧,没办法了,只能默默的看源码,这么多,我怎么看呢?怎么入手,自己在源代码中看到了ts_config.c这个文档,和自己出错显示的Couldnt load module pthres  ts_config() failed (No such file or directory),名字有点像,而且显示ts_config.c failed,可能调用这个函数出错了,返回值不是0;于是我就进入ts_config.c文档查看,发现函数返回值是ret;好吧,我就在这个函数中所有出现ret 的地方,添加返回值ret的打印,遇到调用其他函数的地方,我都进入,添加打印就这样一层层的添加返回值ret的打印;(我看源码使用的sourceInsight慢慢深入的查看)

7、好吧,再次编译了tslib库,再次编译QT、重复了上面编译tslib和QT的步骤;

8、再次执行./ts_calibrate校准程序,发现自己添加的返回值打印都是0;说明没有问题;

9、我再进行测试QT小程序test;此时显示在加载 pthres模块时dlopen()函数出错;返回值是NULL,说明dlopen函数去打开动态链接库pthres.so失败了,我猜想pthres.so有问题,但./ts_calibrate校准程序的源代码中也调用了dlopen()函数去打开pthres.so,却成功了呢????到这儿我已经奔溃了......

10、查关于dlopen()函数的资料,网上看到可以解析dlopen()函数错误原因,于是我在源码中添加了如下代码:

if (ret == NULL)  

{

       printf("dlopen err:%s.\n",dlerror());  

}

11、好吧,再次编译了tslib库,再次编译QT、重复了上面编译tslib和QT的步骤;

12、再次进行测试QT小程序test,此时显示dlopen()函数打开pthres.so失败的原因是:pthres.so: undefined symbol: tslib_parse_vars.

13、查关于pthres.so: undefined symbol: tslib_parse_vars.的资料;看到了一个博客http://www.xuebuyuan.com/1604874.html

里面写到:

初始tslib会动态加载tslib的一些模块,这四个模块pthres、variance、dejitter、linear会用到libts.so这个库里的一个函数tslib_parse_vars;

而tslib的测试程序已经动态链接了libts.so,加载 tslib的上速模块时能够正确识别函数tslib_parse_vars。

终于找到原因了,需要在 /etc/profile中动态链接到库libts.so;

14、vim /etc/profile

在最后添加如下内容:

export QT_ROOT=/tmp/Arm-qt                                

export TSLIB_ROOT=/usr/Arm-tslib                     

export  TSLIB_CONSOLEDEVICE=none           

export  TSLIB_FBDEVICE=/dev/fb0                               

export  TSLIB_TSDEVICE=/dev/input/event0               

export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf                  

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts                      

export  QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0        

export  QT_QPA_FONTDIR=$QT_ROOT/lib/fonts               

export  QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins          

export  QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0                  

export  TSLIB_CALIBFILE=/etc/pointercal               

export  QT_PLUGIN_PATH=$QT_ROOT/plugins/              

export  LD_LIBRARY_PATH=$QT_ROOT/lib:$TSLIB_ROOT/lib  

export  LD_PRELOAD=$TSLIB_ROOT/lib/libts.so       (这一条特别重要)

15、source  /etc/profile

16、再次进行测试QT小程序test,终于成功了。

================================================================

触摸屏有反应了,但是还是存在很多问题,比如触摸不是很灵敏,界面不能显示菜单栏.........

备注:如果本人因为在上述配置中存在问题,才导致出现这样问题,希望大神能够指点。也希望这篇博客能帮助到大家!这是本人第一次写博客,如有不足望指正!