您的位置:首页 > 编程语言 > Qt开发

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

2017-05-24 16:05 597 查看
这是自己第一次写博客,因为在编译的过程中遇到了很多挫折,出现了一个小的问题,查看了很多帖子,博客都没能解决,最后经过对源码的分析,各种打印跟踪,找到了原因,所以分享给大家,希望对大家有所帮助!!在此过程中也参照了很多其他大神的资料,在此非常感谢。
===========================================================================================
开发平台: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.gz2、cd /home/ubuntu 3、mkdir qt5.74、将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.gz7、cd qt-everywhere-opensource-src-5.7.08、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.sh14、./autoConfigure.sh
15、make (时间比较漫长)16、make install17、此时可以在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,终于成功了。

================================================================
触摸屏有反应了,但是还是存在很多问题,比如触摸不是很灵敏,界面不能显示菜单栏.........
备注:如果本人因为在上述配置中存在问题,才导致出现这样问题,希望大神能够指点。也希望这篇博客能帮助到大家!这是本人第一次写博客,如有不足望指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编译 tslib QT5.7