天天看点

linux交叉编译qt5库,QT5.7+tslib1.4库的交叉编译、移植到开发板ARM9上.......

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

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

开发平台: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 pthrests_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,终于成功了。

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

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

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