讯为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 内核源码是一样的,编译环境和编译方法也一样

相关推荐
星火开发设计2 小时前
C++ multimap 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识
superman超哥2 小时前
Rust 异步并发基石:异步锁(Mutex、RwLock)的设计与深度实践
开发语言·后端·rust·编程语言·rust异步并发·rust异步锁·rust mutex
码农水水2 小时前
阿里Java面试被问:RocketMQ的消息轨迹追踪实现
java·开发语言·windows·算法·面试·rocketmq·java-rocketmq
APIshop2 小时前
实战解析电商api:1688item_search-按关键字搜索商品数据
开发语言·python
向上的车轮2 小时前
Zed 项目GPUI :用 Rust + GPU 渲染的现代化 UI 框架
开发语言·ui·rust
nbsaas-boot2 小时前
Go 语言中的集合体系:从语言设计到工程实践
开发语言·后端·golang
李日灐2 小时前
C++STL:deque、priority_queue详解!!:详解原理和底层
开发语言·数据结构·c++·后端·stl
阿坤带你走近大数据2 小时前
JavaScript脚本语言的简单介绍
开发语言·javascript·ecmascript