|
【Linux】
基于RK3288 Ubuntu 16.04 交叉编译QT5.5.1源码带触摸功能
发表于 2019-9-26 19:00:09
浏览:9672
|
回复:3
打印
只看该作者
[复制链接]
楼主
本帖最后由 17701603601 于 2019-9-26 19:04 编辑
基于RK3288 Ubuntu 16.04 交叉编译QT5.5.1源码带触摸功能
功能概述:
1 软件要求:编译环境初始化
2 Tslib触摸库安装编译
3 QT5 源码编译
4 QTcreator 配置
目录
1 软件要求:编译环境初始化 2
2 Tslib库的安装 2
3 交叉编译ARM-QT源码 3
1 编译前准备工作
(1)平台及资源
主机环境:ubuntu 16.04
开发板 :RK3288系列
tslib:tslib 1.4
编译器:arm-linux-gnueabihf 交叉编译器,最好选择开发板厂商提供的交叉编译工具链
sudo uname -a 查看操作系统是32位的还是64位的
firefly@firefly:~$ uname -a
Linux firefly 4.4.154 #42 SMP Wed Jul 31 12:56:04 CST 2019 armv7l armv7l armv7l GNU/Linux
(2)软件要求:编译环境初始化
• Ubuntu 16.04 软件包安装
$ sudo apt-get -y update //需要更新资源文件列表
$ sudo apt-get install -y git u-boot-tools device-tree-compiler mtools
$ sudo apt-get install -y libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools libssl-dev dpkg-dev flex bison autotools-dev liborc-dev autopoint
$ sudo apt-get install -y autotools-dev libsigsegv2 m4 libdrm-dev curl sed make binutils build-essential gcc g++ bash
$ sudo apt-get install -y patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libglib2.0-dev openssh-client lrzsz dbus unrar
$ sudo apt-get install -y autoconf automake autogen libtool libffi-dev
$ sudo apt-get install -y cmake qt5-default qtcreator
$ sudo apt-get install -y gtk-doc-tools libgstreamer1.0-dev
$ sudo apt-get install -y qtmultimedia5-dev libpulse-dev libqt5serialport5-dev
$ sudo apt-get install -y device-tree-compiler lzop libncurses5-dev libssl1.0.0 libssl-dev
• GNU构建系统搭建:
$ sudo apt-get install autoconf automake libtool
$ sudo apt-get install libffi-dev
Autoconf与Automake、Libtool等软件组成了GNU构建系统。
GNU Autoconf是一个在Bourne shell下制作供编译、安装和打包软件的配置脚本的工具。用于GNU Autoconf(2.69版),这是一个使用模板和M4宏包创建脚本来配置源代码包的包。(http://tool.oschina.net/apidocs/apidoc?api=autoconf)。
automake编程者只需要写一些预先定义好的宏 (macro),提交给 Automake 处理,就会产生一个可以供Autoconf 使用的 Makefile.in 文件。再配合使用 Autoconf 产生的自动配置文件 configure(https://blog.csdn.net/encoder1234/article/details/79423719)。
libtool 在不同的系统中建立动态链接库(https://www.cnblogs.com/icmzn/p/9704543.html)
libffi的作用就相当于编译器,它为多种调用规则提供了一系列高级语言编程接口,然后通过相应接口完成函数调用( https://blog.csdn.net/jaimecool/article/details/76332930)。
• 安装 ARM 交叉编译工具链和编译内核相关软件包
$ sudo apt-get install device-tree-compiler lzop
$ sudo apt-get install libncurses5-dev libssl1.0.0 libssl-dev
备注:
gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu是嵌入式系统自带的不需要再安装
• 远程连接软件安装(选择安装非必须)
$ sudo apt-get install xrdp vnc4server xbase-clients 远程连接软件安装
(3) 交叉编译器验证
原文链接:https://blog.csdn.net/jzzy_hony/article/details/80859450
编辑主机当前账户主目录的.bashrc文件,将编译工具链的路径添加到环境变量中。
$ cd ~ #切换到当前用户的主目录下
$ vim .bashrc #编辑.bashrc文件,并在末尾添加以下文本
>>> export PATH=$PATH:/usr/ bin/
$ source .bashrc #使环境变量生效
使用 arm-linux-gnueabihf-gcc -v 命令查看当前版本号,同时检查环境变量配置是否生效
$ arm-linux-gnueabihf-gcc -v #查看编译器已经生效
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/5/lto-wrapper
Target: arm-linux-gnueabihf
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.11)
2 触摸屏应用编程Tslib库的安装
触摸屏驱动一般是采用input子系统驱动框架实现的,所以应用层接口要遵循input框架的接口,在介绍触摸屏应用编写前,先来学习input应用编程。
(1)使用hexdump读取input设备
在Linux下查看ls /dev/input,可以看到现在有的输入设备
比如我的结果是:
$ ls /dev/input/
by-id by-path event0 event1 event2 event3 event4 event5
这些都是通过input子系统实现的输入设备驱动,遵循input子系统规范
其中event1为我的触摸屏设备节点,通过下面命令读取(hexdump读取的数是以16进制打印)
$ hexdump /dev/input/event1
当我点击触摸屏然后松开,发现控制台打印了许多消息
0005990 46d2 5d7f a5fc 000e 0003 0035 006c 0000
00059a0 46d2 5d7f a5fc 000e 0003 0036 00fc 0000
00059b0 46d2 5d7f a5fc 000e 0003 0030 0018 0000
00059c0 46d2 5d7f a5fc 000e 0003 0032 0018 0000
00059d0 46d2 5d7f a5fc 000e 0003 0039 0000 0000
00059e0 46d2 5d7f a5fc 000e 0000 0002 0000 0000
00059f0 46d2 5d7f a5fc 000e 0000 0000 0000 0000
0005a00 46d2 5d7f d607 000e 0003 0035 0040 0000
0005a10 46d2 5d7f d607 000e 0003 0036 00f4 0000
0005a20 46d2 5d7f d607 000e 0003 0030 0018 0000
0005a30 46d2 5d7f d607 000e 0003 0032 0018 0000
其中每一行都表示一个input事件,如果单纯这样子看是分析不出所以然的,我们需要先介绍input事件,然后再来分析。
(2) Tslib库的移植
参考文献:https://blog.csdn.net/jzzy_hony/article/details/80881597
使用github安装或者直接安装包安装,我自己使用最新的安装包安装。
(1)GitHub安装
$ sudo apt-get install git #安装git
$ sudo git clone https://github.com/kergoth/tslib.git #克隆tslib
>>>
正克隆到 'tslib'...
remote: Counting objects: 5089, done.
remote: Total 5089 (delta 0), reused 0 (delta 0), pack-reused 5089
接收对象中: 100% (5089/5089), 2.39 MiB | 429.00 KiB/s, 完成.
处理 delta 中: 100% (3505/3505), 完成.
检查连接... 完成。
<<<
(2)安装包安装
解压tslib /home/firefly/qt/tslib
$ sudo mkdir -p ~/qt/tslib
上传文件tslib-master.zip至 ~/qt/tslib
$ sudo mkdir /opt/tslib
$ sudo chmod -R 777 /opt/tslib
$ sudo unzip -d ~/qt/tslib tslib-master.zip
(3)安装编译工具
$ sudo apt-get -y update
$ sudo apt-get install autoconf automake libtool
$ sudo apt-get install libffi-dev
(4)生成./configure等配置文件
$ sudo ./autogen.sh
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4/internal'.
libtoolize: copying file 'm4/internal/libtool.m4'
libtoolize: copying file 'm4/internal/ltoptions.m4'
libtoolize: copying file 'm4/internal/ltsugar.m4'
libtoolize: copying file 'm4/internal/ltversion.m4'
libtoolize: copying file 'm4/internal/lt~obsolete.m4'
configure.ac:58: installing './compile'
configure.ac:24: installing './config.guess'
configure.ac:24: installing './config.sub'
configure.ac:7: installing './install-sh'
configure.ac:7: installing './missing'
Makefile.am: installing './INSTALL'
plugins/Makefile.am: installing './depcomp'
提示错误:
./autogen.sh: 4: autoreconf: not found
解决方法:
sudo apt-get install autoconf automake libtool
(5)配置生成makefile的相关功能性属性及编译条件
使用下面的语句
$ sudo ./configure --prefix=/opt/tslib/ CC=arm-linux-gnueabihf-gcc --host=arm-linux ac_cv_func_malloc_0_nonnull=yes #--enable-inputapi=no
--enable-inputapi=no:看你的触摸屏驱动是否支持ioctl操作,如果支持就不用写上,不支持就要添上,如果不添加会有
ts_open:Inappropriate ioctol for device
ts_open: No such file or directory
等错误(网上别人的文档是这么说的,我没有试过不加这个参数会怎样,感兴趣的试一下)
(6)编译tslib库
$ sudo make -j4
执行 make 出错:error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
解决方法:
修改cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR ,0777)(据说是交叉编译器版本问题)
(7)安装编译好的支持触摸屏的tslib库
$ sudo make install
编译并安装后会在/opt /tslib生成bin,etc,include,lib四个文件夹。
bin文件夹下是tslib的测试程序,把它们复制到开发文件系统下的/bin或者/opt/tslib/bin下,除了ts_calibrate触摸屏校准程序外,其他几个测试程序可有可无。
etc文件夹内只有一个文件ts.conf,把它复制到目标板文件系统下的/etc目录,修改/etc/ts.conf配置如下:
module_raw input (注意把这句前的注释符#删除)
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
include文件夹包含有关tslib的头文件tslib.h,不需要复制到目标板。
lib文件夹下是tslib的动态库的。在目标板文件系统/usr/local/下新建文件夹tslib,把lib文件夹下的所有文件都复制过去。
(8)环境变量设置
在使用tslib时,应该先导出环境变量
$ sudo vim /etc/profile
打开profile:vi /etc/profile 添加:
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
备注:
1 export TSLIB_TSDEVICE=/dev/input/event1 (指定触摸屏设备)
export TSLIB_CALIBFILE=/etc/pointercal(指定触摸屏校准文件 pintercal 的存放位置)
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf(指定TSLIB配置文件的位置)
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts(指定触摸屏插件所在路径)
export TSLIB_FBDEVICE=/dev/fb0(指定帧缓冲设备)
2 使用TSLIB_ROOT这个变量比较好,因为只要将编译生成后的tslib文件夹复制到某个位置,再修改这个变量即可,其它的不用修改。
3
(9)配置文件ts.conf内容如下:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
(10)运行ts的测试程序,在tslib/bin目录下输入
$ cd /opt/tslib/bin
$ sudo ./ts_print 或者sudo ./ts_test
打印一下信息:
1568624402.981355: 144 22 255
1568624402.994233: 144 22 255
1568624403.007003: 144 22 255
1568624403.019774: 151 23 255
1568624403.032608: 167 27 255
1568624403.045392: 195 34 255
1568624403.058100: 231 42 255
1568624403.070954: 269 52 255
1568624403.083621: 310 64 255
1568624403.096485: 350 76 255
1568624403.109337: 392 88 255
1568624403.122047: 437 100 255
1568624403.134933: 487 114 255
1568624403.147611: 544 129 255
第一列为timeval结构体的两个成员:tv_sec和tv_usec,中间两列分别是X和Y的坐标,最后为pressure,这里可以理解成“触摸事件”,为255表示触摸笔点击了(接触)屏幕,为0表示触摸笔离开了屏幕。
4 交叉编译ARM-QT源码
参考链接:https://blog.csdn.net/jzzy_hony/article/details/81141481
Qt5源代码下载
(1)选择版本Qt5.5.1
为啥不选择其他更高版本? 负责任的告诉大家,编译不过!!! 目前尝试5.8和5.9都编译失败,很想吐槽Qt官方所谓的发布版本,其他版本还没有尝试。另一个原因就是RK3288开发板上面的libQt5Core.so的版本是5.5.1, 当然要版本一致才行,至于版本不一致会有什么问题,俺也不晓得。
下载链接:http://download.qt.io/archive/qt ... ce-src-5.5.1.tar.xz
建议:代码解压后最好在本地用git管理起来,这样方便还原以及清理。想重新编译只需要git clean -df就可以还原,非常方便。给git一个赞!
(2)安装QtCreator及必要的支持库
安装QtCreator指令:
$ sudo apt-get install cmake qt5-default qtcreator
$ sudo apt-get install libghc-x11-dev
$ sudo apt-get install xorg-dev
$ sudo apt-get install qtmultimedia5-dev libpulse-dev libqt5serialport5-dev
解决: defaultserviceprovider::requestservice(): no service found for - "org.qt-project.qt.mediaplayer 需要使用mulitimedia库
$ sudo apt-get install libqt5serialport5-dev
解决: Project ERROR: Unknown module(s) in QT: serialport
一、将下载好的Qt源码qt-everywhere-opensource-src-5.5.1.tar.xz进行解压
$ tar -vxf qt-everywhere-opensource-src-5.5.1.tar.xz
(3)创建安装目录
$ sudo mkdir -p /opt/qt-5.5.1-arm
$ sudo chmod -R 777 /opt/qt-5.5.1-arm
(4)修改编译器Qmake配置文件qmake.conf
1.切换至解压后源码目录
$ cd qt-everywhere-opensource-src-5.5.1
2.按照以下路径打开qmake.conf配置文件
$ sudo vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
添加
QMAKE_INCDIR += /opt/tslib/include #指定头文件,需预编译
QMAKE_LIBDIR += /opt/tslib/lib #指定库文件,需预编译
3.将所有arm-linux-gnueabi都改成arm-linux-gnueabihf
(5)配置Configure(重要关键)
1.切回qt源码主目录
$ cd qt-everywhere-opensource-src-5.5.1 //依据自己的路径切换
2、配置生成makeFile的相关功能性属性及编译条件
$ ./configure --prefix=/opt/qt-5.5.1-arm -opensource -nomake tests -nomake examples -xplatform linux-arm-gnueabi-g++ -tslib -I/opt/tslib/include -L/opt/tslib/lib -qt-xcb -confirm-license -no-pkg-config -v
注意:-prefix选项后面的路径就是上一步中定义的SDK路径
这一步配置往往会出现问题,出现问题后,基本上可以在网上可以查到原因。按照步骤依次执行下来,原则上不会出现问题。下面介绍一下配置文件的一些解释说明,自己也可以输入进行查询帮助。
$ ./configure -help
(1). 我这里指定使用-static来生成静态库是为了方便程序在板端运行,减少对库加载路径的配置以及文件目录的挂载。执行程序时不需要再设置一堆的环境变量以及挂载库的路径
(2). -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype这几个选项最好使用qt库自带的源码,不然如果系统上没有这个库或者找不到,自行编译这些库后再加入到相关路径上还需要为这些库写依赖文件才能使用,没有依赖文件,链接程序时会报一些插件找不到的错误
(3). -platform linux-g++指的是你在什么机器上编译这些文件,一般都是ubuntu或者centeros,-xplatform指的是程序要运行在什么平台,linux-g++会用来编译一些使用工具,像生成.qch帮助文档的qhelpgenerator,xplatform则指定编译库代码时用的编译器,以及生成make所有的qmake工具
(4). -xplatform 所指定的不是交叉编译工具链的名字,而是交叉编译配置文件的名字,该文件需在~/qt/qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs目录下,可以拷贝inux-arm-gnueabi-g++,然后根据自己交叉编译工具修改qmake.conf,linux-arm-gnueabi-g++ 的编译器可以直接使用
问题汇总:
1 错误:
The test for linking against libxcb and support libraries failed!
You might need to install dependency packages, or pass -qt-xcb.
See src/plugins/platforms/xcb/README.
解决方式:
./configure -prefix /opt/qt-5.5.1-arm -opensource -nomake tests -nomake examples -opensource -xplatform linux-arm-gnueabi-g++ -tslib -I/opt/tslib/include -L/opt/tslib/lib -qt-xcb
2 错误:由于在配置生成makefile时,tslib库的安装路径与配置路径不一致导致。
The tslib functionality test failed!
解决方式:是因Qmake时没有找到Tslib的安装库目录,那可以将正确的tslibde头文件和库目录路径添加在Qmake配置文件中:
方式1:
需要在qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf重新配置文件
仔细核对以下表示的tslib配置路径是否与安装路径一致。
$ ./configure -prefix /opt/qt-5.5.1-arm -opensource -nomake tests -nomake examples -opensource -xplatform linux-arm-gnueabi-g++ -tslib -I/opt/tslib/include -L/opt/tslib/lib -qt-xcb -confirm-license
3 出现错误
$ make clean
(6) 编译
$ sudo mkdir -p /opt/qt-5.5.1-arm #在主机/opt目录下创建qte5.5.1目录
$ sudo make -j4 #-j 4 表示4个线程同时编译,减少编译时间
(这里编译可能在一小时左右,可以暂时离开做其他工作)
(7)安装交叉编译后源码的SDK库
$ sudo make install #安装Qt
$ cd /opt/ qt-5.5.1-arm/bin
$ ./qmake -v #查看Qt,编译成功
>>>>
QMake version 3.0
Using Qt version 5.5.1 in /opt/qte5.5.1/lib
<<<<
5 Qt环境变量配置:
1.打开环境配置文件
$ vi /etc/profile
2.末尾添加
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export PATH=/opt/qt-5.5.1-arm/bin:$PATH
export QTDIR=/opt/qt-5.5.1-arm
export QTDEDIR=$QTDIR
#这个是触摸屏幕的旋转,和颠倒
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=180:invertx and inverty
export TSLIB_TSEVENTTYPE=input
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event1
export QT_QPA_FB_TSLIB=1
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QTDIR/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_QPA_FONTDIR=$QTDIR/fonts
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
#说好的隐藏呢
export QT_QPA_FB_HIDECURSOR=1
原文链接:https://blog.csdn.net/Agou_66/article/details/72461323
3.wq退出,使新配置的变量立即生效。
$ source /etc/profile 或者 $ sudo reboot
6 Qt Creator配置
1>安装QtCreator指令:
$ sudo apt-get install cmake qt5-default qtcreator
2> 配置Qt Creator的交叉编译器及Qt Version
a) 启动Qt Creator
b) 选择[Tools]-[Options]-[Build & Run]
c) 配置Qt Versions,如图:点击add,增加刚才编译好的qt源码的qmake
d) 配置编译器,如图 创建GCC编译器,ARM-GCC和 ARM-G++
e) 配置Kits,如图 选择刚才添加的编译器ARM-G++,选择刚才添加的qt qmake
3> 新建测试程序
a) 创建UI测试程序,并尝试触摸是否有效
7 常用命令集合
1 $ uname -a
firefly@firefly:~$ uname -a
Linux firefly 4.4.154 #42 SMP Wed Jul 31 12:56:04 CST 2019 armv7l armv7l armv7l GNU/Linux
2 $ df -h
firefly@firefly:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 2.3G 12G 17% /
devtmpfs 990M 0 990M 0% /dev
tmpfs 999M 220K 999M 1% /dev/shm
tmpfs 999M 18M 982M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 999M 0 999M 0% /sys/fs/cgroup
tmpfs 200M 0 200M 0% /run/user/0
tmpfs 200M 48K 200M 1% /run/user/1000
2 $ sudo git checkout -b 1.9-rc1
$ git tag -l 或者 git tag -l -n
firefly@firefly:~/tslib$ sudo git checkout -b 1.9-rc1
Switched to a new branch '1.9-rc1'
firefly@firefly:~/tslib$ git tag -l
1.11-rc1
1.12
1.12-rc1
1.13
1.13-rc1
1.13-rc2
1.14
1.14-rc1
1.14-rc2
1.15
8 参考文献
(1)usb触摸屏驱动
http://blog.csdn.net/paomadi/article/details/8754783 usb触摸屏
http://blog.csdn.net/paomadi/article/details/8309861 输入子系统
(2)让qt应用程序支持触摸
https://blog.csdn.net/orz415678659/article/details/9136575
(3)G63818开发环境搭建-Qt5.5.1交叉编译
https://blog.csdn.net/simonforfuture/article/details/78600192
(4)Qt5.4.1移植到arm——Linuxfb篇
http://bbs.myir-tech.com/thread-7174-1-1.html
(5)qt5.5.1在Cortex-a8上移植记录
https://blog.csdn.net/dujiqian/article/details/49590735
(6)海思3519上移植Qt5.5.1
https://blog.csdn.net/KOdeCSDN/article/details/80170325
(7)arm-linux-gnueabihf-gcc下载
https://blog.csdn.net/pyuan523/article/details/49448917
Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建
https://www.cnblogs.com/flyinggod/p/9468612.html
(8)移植Qt5.5到arm开发板(全世界的问题我一个人碰完了)
https://blog.csdn.net/qq_41399894/article/details/86475472
(9)Linaro的官方网站:
http://www.linaro.org/。
(10)QT5.8交叉编译-arm架构运行!包含触摸屏tslib配置
https://blog.csdn.net/Agou_66/article/details/72461323
(11)qt-5.6.0 移植之qt源码编译
https://www.cnblogs.com/chenfulin5/p/5798764.html
(12)移植QT5.7.0到64位fireflyPK3399开发板
https://blog.csdn.net/u010936131/article/details/79542163
(13)Qt程序移植到Firefly开发板(Arm linux)下运行--转载
https://blog.csdn.net/bobbat/article/details/51435197
(14)海思3519上移植Qt5.5.1
https://blog.csdn.net/KOdeCSDN/article/details/80170325
(15)交叉编译Qt5.5.1
https://blog.csdn.net/jzzy_hony/article/details/81141481
|
|