讯为iTOP4412-Qt5.7环境搭建

本文简介

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-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)

然后保存退出,使用"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 内核源码是一样的,编译环境和编译方法也一样

相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript