移植QT5.7到嵌入式ARM

配置开发环境

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++交叉编译器,如下图所示:

移植QT5.7到嵌入式ARM_第1张图片

切换到Qt Versions标签,点击“Add”按钮,选择qmake,如图所示:

移植QT5.7到嵌入式ARM_第2张图片

选择完成,按“OK”按钮,设置如图所示:
切换到Kits标签,点击“Add”按钮,然后设置如下图所示:

移植QT5.7到嵌入式ARM_第3张图片

在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设置成输入模式(注意把前面的空格也去掉)

移植QT5.7到嵌入式ARM_第4张图片

将编译得到的可执行文件拷贝到开发板中文件系统的/bin目录,运行该程序。

注意:不用开发板的触摸屏输入设备不一样,如tiny4412是dev下的1-wire字样的输入设备。需要修改TSLIB_TSDEVICE。

你可能感兴趣的:(C++)