本文简介
iTOP4412-Qt5.7环境搭建
实验平台
①ubuntu 版本:16.04
②编译器:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
③硬件平台:iTop4412
④触摸工具:tslib-1.4.tar.gz
⑤Qt 源码:qt-everywhere-opensource-src-5.7.0.tar.gz
版权声明
①作者:coLin
②声明:问题总结,有误解,请联系纠正。
正文
一、Qt 简介
Qt 5.7 是 Qt 5 系列中的一个稳定版本,是一个跨平台的 C++ 图形用户界面(GUI)应用开发框架,广泛应用于桌面、嵌入式和工业控制领域。
Qt 提供了丰富的模块,包括 GUI 界面开发、事件机制、信号与槽、网络通信、多线程、文件系统、数据库、多媒体 等功能,开发者可以使用统一的 API 在 Windows、Linux、macOS 以及嵌入式 Linux 等平台上开发应用程序。
Qt 5.7 支持 C++11 标准 ,并引入了性能优化和更完善的模块化设计。通过 信号与槽机制,实现对象之间的松耦合通信,提高程序的可维护性和稳定性。
在嵌入式领域,Qt 5.7 具备良好的触摸屏支持和硬件适配能力,常用于 HMI、人机界面、工业设备控制界面、医疗设备、仪器仪表 等产品。
二、交叉编译器安装
将编译器拷贝到"/usr/local/arm"目录下,并解压。使用命令"cd"(一定要使用 root 账户)回到家目录,接着使用"vim .bashrc"命令,打开环境变量配置文件,添加 export PATH=$PATH:/usr/local/arm/arm-2014.05/bin,如下图所示。

接着还需要更新一下环境变量,如下图所示,使用命令"source .bashrc"

最后做一下环境变量测试。重启下控制台后,在 Ubuntu 控制台中输入"arm-none-linux-gnueabi-gcc -v",然后回车,会出现如下图所示内容。

三、编译触摸
我这里放再 /opt/目录下
下载并解压源码 tslib-1.4.tar.gz,tar -vxf tslib-1.4.tar.gz
然后执行如下命令。
cd tslib
./autogen.sh
./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --host=arm-none-linux-gnueabi --prefix=/opt/tslib1.4 ac_cv_func_malloc_0_nonnull=yes
make
make install
vim /opt/tslib1.4/etc/ts.conf 修改第二行如下

注意这里第二行 module_raw input 前面不能有空格,保存,退出。
四、交叉编译 QtE5.7 库
使 用 " tar -vxf qt-everywhere-opensource-src-5.7.0 " 命 令 解 压QtE5.7 源 码 , 并 进 入 解 压 生 成 的"qt-everywhere-opensource-src-5.7.0"目录。
在"qt-everywhere-opensource-src-5.7.0"目录下,使用"vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf "命令,打开 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-ainclude(../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)
然后保存退出,使用"vi autoconfigure.sh"命令,新建"autoconfigure.sh"脚本。脚本内容如下所示。
bash
#!/bin/sh
./configure \
-v \
-prefix /opt/qt5.7.0 \
-release \
-opensource \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-no-opengl \
-skip qt3d \
-skip qtcanvas3d \
-skip qtpurchasing \
-no-sse2 \
-no-openssl \
-no-nis \
-no-cups \
-no-glib \
-no-iconv \
-nomake examples \
-nomake tools \
-skip qtvirtualkeyboard \
-I/opt/tslib1.4/include \
-L/opt/tslib1.4/lib
exit
如下图:

保存脚本,退出。使用命令"chmod 777 autoconfigure.sh"修改脚本权限,
然后使用命令"./autoconfigure.sh"执行脚本,会有版本认证,如下图。

输入"yes"即可。接着使用编译命令"make",之后使用安装命令"make install"。完成后,可以在"/opt"目录下可以查看到生成的"qt5.7.0"文件,如下图所示。

在下一小节的打包过程中,会用到该文件
生成 QtE5.7 文件系统镜像
生成镜像'system.img'文件的话需要工具"mkimage"。
在使用'已经搭建好的环境'时,该工具已经给大家设置好,使用自己搭建的环境时,用户要严格按
照如下步骤进行操作,若用户自己使用命令安装该工具,可能会因为版本问题,在打包或烧写时出现各种错误。
安装打包工具:
下载 linux_tools.tgz,拷贝压缩包到 Ubuntu 系统的"/"目录下,注意目录是"/"。进入"/"目录,然后使用"tar -vxf linux_tools.tgz "命令将压缩包解压。解压后,在"/usr/local/bin/"目录下生成了两个文件。如下图所示。

生成 system.img 镜像
使用提供好的根文件系统,在"/home/topeet"目录下,新建"Linux+QtE5.7"文件夹,并把光盘"iTOP-4412精 英 版 \20200624\iTOP-4412 精 英 版 光 盘 资 料 \08_ 源 码 _QtE 以 及qtopia2.2.0 文 件 系 统 " 目 录 下 的"iTOP-4412-QtE5.7_4412_elite.tgz"文件上传到刚才新建的文件夹中,并使用命令 tar -vxf iTOP4412-QtE5.7_4412_elite.tgz ,解压后生成 root 目录,如下图所示。


将刚才编译生成的"qt5.7.0"文件和"tslib1.4"触摸文件,拷贝到"/home/topeet/Linux+QtE5.7/root/opt"目录下 ,并删除之前存在的"qt-4.7.1"和"Qtopia"目录。如下图所示。

将字库文件"fonts"拷贝到"opt/qt5.7.0/lib/"目录下。将"libstdc.tar.gz"拷贝到"./lib"解压,并输入命令:
ln -s libstdc++.so.6.0.19 libstdc++.so.6
含义:
libstdc++.so.6.0.19→ 真实库文件
libstdc++.so.6→ 程序运行时查找的名字(SONAME)建立一个 符号链接
(使用上述链接命令时,如果显示文件已经存在,则继续向下执行即可)修改环境变量"vim etc/profile",如下所示。
bash
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='\e[36m\h@\e[33m\u:\e[34m\e[1m\w\e[0m# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
export TSLIB_ROOT=/opt/tslib1.4
export QT_ROOT=/opt/qt5.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 LD_PRELOAD=$TSLIB_ROOT/lib/libts.so
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
bash
# Ash profile
# vim: syntax=sh
# 说明:BusyBox ash 使用的全局 profile 文件
# 不生成 core dump(程序段错误时不保存 core 文件)
ulimit -S -c 0 > /dev/null 2>&1
# 获取当前用户名(通常是 root)
USER="`id -un`"
# 登录名与 USER 相同
LOGNAME=$USER
# 设置 shell 提示符(带颜色)
# \h 主机名 \u 用户名 \w 当前目录
PS1='\e[36m\h@\e[33m\u:\e[34m\e[1m\w\e[0m# '
# 保持原有 PATH,不做修改
PATH=$PATH
# 获取当前主机名
HOSTNAME=`/bin/hostname`
# 导出环境变量,供子进程使用
export USER LOGNAME PS1 PATH
# tslib 根目录
export TSLIB_ROOT=/opt/tslib1.4
# Qt 根目录
export QT_ROOT=/opt/qt5.7.0
# 指定触摸屏 input 事件设备
export TSLIB_TSDEVICE=/dev/input/event2
# 使用 Linux input 事件方式
export TSLIB_TSEVENTTYPE=input
# tslib 配置文件路径
export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf
# tslib 插件目录
export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts
# 不使用控制台设备输出 tslib 信息
export TSLIB_CONSOLEDEVICE=none
# tslib 使用的 framebuffer 设备
export TSLIB_FBDEVICE=/dev/fb0
# 通过 LD_PRELOAD 强制预加载 tslib 库
# 所有动态程序(包括 qt5.7、sh 等)都会先加载该库
export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so
# Qt4 / Qtopia 使用的触摸输入协议(Qt5 中不使用)
export QWS_MOUSE_PROTO=tslib:/dev/input/event2
# 动态库搜索路径
# 包含系统库、Qt 库和 tslib 库
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/lib/
# Qt 平台插件(QPA)搜索路径
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
# Qt 使用 linuxfb 平台插件,并指定 framebuffer 设备
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
# Qt 字体目录
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
# Qt 通用插件,指定使用 tslib 输入插件
export QT_QPA_GENERIC_PLUGINS=tslib
修改开机启动脚本"vi etc/init.d/rcS",注释掉"/bin/qt4 &",并加上"/bin/qt5.7 &"
bash
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/topeet/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
/bin/mount -n -t ramfs none /tmp
/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
ln -sf /dev/ttyS2 /dev/tty2
ln -sf /dev/ttyS2 /dev/tty3
ln -sf /dev/ttyS2 /dev/tty4
amixer cset numid=5 127
amixer cset numid=6 1
amixer cset numid=30 8,0
amixer cset numid=40 1
amixer cset numid=43 1
amixer cset numid=47 1
/sbin/hwclock -s -f /dev/rtc
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/ttySAC2
echo "Starting networking..." > /dev/ttySAC2
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/ttySAC2
#echo "Starting web server..." > /dev/ttySAC2
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/ttySAC2
#echo "Starting leds service..." > /dev/ttySAC2
#echo " "
#sleep 1
echo "*************************************" > /dev/ttySAC2
echo " http://www.topeetboard.com " > /dev/ttySAC2
echo "*************************************" > /dev/ttySAC2
sleep 2
/etc/firmware/load_firmware
#mkdir /mnt/disk
#mount -t yaffs2 /dev/mtdblock3 /mnt/disk
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
####### #wifi setting #######
#/etc/init.d/ath6kl
#/etc/init.d/mt6620
echo 0 > /proc/sys/kernel/hung_task_timeout_secs
echo "Starting Qt5.7, please waiting..." > /dev/ttySAC2
source /etc/profile
/bin/qt5.7 &
#ts_calibrate
#ts_test
#must run this shell
/bin/sh
在"/home/topeet/Linux+QtE5.7"目录下,使用以下命令打包镜像:
make_ext4fs -s -l 314572800 -a root -L linux system.img root
生成"system.img"镜像文件。

至此,QtE5.7 的编译就全部完成了。
编译 U-boot 和 Kernel 镜像
Qt 系统的 inux 内核和 Android4.0.3 中的 Linux 内核源码是一样的,编译环境和编译方法也一样