移植QT5.7到嵌入式ARM

2019-07-13 04:00发布

配置开发环境

0610更新

1、缺少头文件 error: GL/gl.h: No such file or directory 执行
sudo apt-get install mesa-common-dev
2、编译出现如下错误提示:
/usr/bin/ld: cannot find -lGL
执行下面命令解决:
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev

搭建NFS服务器

  1. 检查内核是否开启NFS
1)进入内核源码目录make menuconfig,进入菜单Networking support->Networking options-> TCP/IP networking。确保nfs的功能已经被打开
IP:BOOTP support 2)进入File systems->Network File Systems 确保nfs加载可以被使用
Root file system on NFS
  1. 搭建NFS服务器
1)安装NFS
apt-get install nfs-kernel-server
apt-get install nfs-common 2) 创建共享目录,我在home/lz下创建了一个/nfs/rootfs,将其作为共享目录。并修改权限
chmod 777 -R /home/lz/nfs/rootfs 3) 配置NFS,打开配置文件并在最后一行添加
sudo gedit etc/exports
在最后一行添加
/home/lz/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
其中
/home/lz/nfs/rootfs:与nfs服务客户端共享的目录,这个路径必须和你前面设置的文件的路径一致!
*:允许所有的网段访问,也可以使用具体的IP
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限。
no_subtree_check:不检查父目录的权限 4)重启NFS服务
执行命令:sudo /etc/init.d/portmap restart
sudo /etc/init.d/portmap restart
重启portmap服务。nfs是一个RPC程序,使用它前,需要映射好端口,通过portmap设定。
注意:Ubuntu 14.04以后,要使用sudo /etc/init.d/rpcbind restart 重启rpcbind 服务。所以执行
sudo /etc/init.d/rpcbind restart
然后执行命令:
sudo /etc/init.d/nfs-kernel-server restart
重启nfs服务。并执行
showmount localhost -e
查询是否成功。
  1. nfs用作嵌入式linux的文件系统
1) 设置u-boot启动参数
在U-Boot中设置启动参数
U-Boot>setenv bootargs root=/dev/nfs nfsroot=192.168.1.2:/home/lz/nfs/rootfs ip=192.168.1.3:192.168.1.2:192.168.1.10:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
其中:
root=/dev/nfs 并非真的设备,而是一个告诉内核要通过网络取得根文件系统。
nfsroot=你的主机IP:根文件系统路径
ip=你的开发板ip地址,注意开发板的ip地址只要和主机ip地址在一个网段内就可。
/home/lz/nfs/rootfs是主机的共享目录(即rootfs),192.168.1.2代表的是主机ip,192.168.1.3代表开发板ip,192.168.1.10是网关,eth0是主机和开发板相接的网卡。注意这是一整行没有换行,改完save一下。
U-Boot>sa
保存后,用boot启动linux
U-Boot>boot 2)挂载nfs文件系统
在linux系统里也可以挂载nfs文件
sudo mount -t nfs 192.168.1.2:/home/lz/nfs/rootfs /nfs/test

安装32位运行库

sudo apt-get install libc6:i386 sudo -i cd /etc/apt/sources.list.d echo "deb http://archive.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >ia32-libs-raring.list apt-get update apt-get install ia32-libs rm /ia32-libs-raring.list apt-get update exit sudo apt-get install gcc-multilib

下载资源

  1. tslib触摸屏用
  2. qt5.7源码

安装交叉编译器

$sudo apt install gcc-arm-linux-gnueabi $sudo apt install gcc-arm-linux-gnueabihf 交叉编译tslib1.4 对触摸屏信号的获取、校正、滤波处理,均采用开源的tslib,本文采用的tslib版本为最新的tslib1.4(可以从本文提供的链接中下载tslib1.4)。
1.将下载好的tslib1.4拷贝到/home/lz/transplant目录下(可以根据自己的系统选择某一目录),然后执行解压缩命令 tar -vxf tslib-1.4.tar.gz 切换到tslib目录: cd tslib 安装交叉编译tslib必须的一些工具(可以先查看是否已安装,ubuntu16.04自带这些工具,可跳过) sudo apt-get install autoconf sudo apt-get install automake sudo apt-get install libtool 2.利用脚本写编译过程
在tslib文件夹下新建文件configTslib14.sh vi configTslib14.sh 内容如下: #!/bin/sh make clean && make distclean echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/tslib1.4 --cache-file=arm-linux.cache make && make install 然后运行configTslib14.sh ./configTslib14.sh 执行结束后,我们查看一下是否安装成功,执行命令: ls /opt/tslib1.4 如果出现bin,etc,include,lib这4个目录,如下图所示,说明交叉编译并安装tslib成功。

交叉编译QT库

将下载的qt-everywhere-opensource-src-5.7.0.tar.gz执行如下命令解压: tar -vxf qt-everywhere-opensource-src-5.7.0.tar.gz cd qt-everywhere-opensource-src-5.7.0 修改交叉编译架构用到的信息: gedit qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 修改如下图所示: # # qmake configuration for building with arm-linux-gnueabi-g++ # 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-linux-gnueabi-gcc QMAKE_CXX = arm-linux-gnueabi-g++ QMAKE_LINK = arm-linux-gnueabi-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++ # modifications to linux.conf QMAKE_AR = arm-linux-gnueabi-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy QMAKE_NM = arm-linux-gnueabi-nm -P QMAKE_STRIP = arm-linux-gnueabi-strip load(qt_config) 创建一个脚本文件,用于生成Makefile,执行命令 gedit autoConfigure.sh 输入下面内容并保存: #!/bin/sh ./configure -v -prefix /opt/arm-qt -qmldir /opt/arm-qt/qml2 -release -opensource -confirm-license -make libs -xplatform linux-arm-gnueabi-g++ -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -tslib -no-opengl -no-sse2 -no-openssl -no-nis -no-cups -no-glib -no-pkg-config -no-separate-debug-info -make tools -tslib -skip qtvirtualkeyboard -I/opt/tslib1.4/include -L/opt/tslib1.4/lib exit 执行命令: chmod 777 qt.configure.sh ./autoConfigure.sh 上述命令自动生成Makefile文件。
执行命令启动编译: make -j5 编译大概四十分钟
编译结束后,执行安装命令: sudo make install 将/opt/arm-qt 和/opt/tslib1.4 拷贝到开发板的文件系统中对应的目录中。

设置QT的交叉编译环境

安装qtcreator
进入qtcreator开发环境
在菜单中选择Tools——Options,在弹出的对话框中,选择Build & Run,选择标签Compilers,按下图设置,选择C++交叉编译器,如下图所示: 切换到Qt Versions标签,点击“Add”按钮,选择qmake,如图所示: 选择完成,按“OK”按钮,设置如图所示:
切换到Kits标签,点击“Add”按钮,然后设置如下图所示: 在4412开发板上配置tslib并交叉编译一个能够在4412开发板上运行的QT应用程序 把字库Ubuntu_L.ttf 等字库拷贝到 /opt/arm-qt/lib/fonts 在开发板串口命令窗口中输入: vi /etc/profile 将其修改为以下内容: export TSLIB_ROOT=/opt/tslib1.4 export QT_ROOT=/opt/qt-5.7.0 export TSLIB_TSDEVICE=/dev/input/event2 export TSLIB_TSEVENTTYPE=input export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export QWS_MOUSE_PROTO=tslib:/dev/input/event2 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/lib/ export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts export QT_QPA_GENERIC_PLUGINS=tslib 保存退出,执行命令(一定要执行,否则可能报错): source /etc/profile 然后在串口命令窗中输入 vi /opt/tslib1.4/etc/ts.conf 来配置触摸屏 把第二行的注释去掉,把ts设置成输入模式(注意把前面的空格也去掉) 将编译得到的可执行文件拷贝到开发板中文件系统的/bin目录,运行该程序。
注意:不用开发板的触摸屏输入设备不一样,如tiny4412是dev下的1-wire字样的输入设备。需要修改TSLIB_TSDEVICE。