1、使用Buildroot 构建 Qt 根文件系统
1.1 获取 Buildroot 源码
Buildroot 源码下载地址, https://buildroot.org/。下载完成后拷贝到Ubuntu目录,输入下面的指令进行解压。
tar xf buildroot-2022.02.3.tar.gz
1.2 配置 Buildroot
进入 buildroot-2022.02.3 目录。 输入下面的指令安装显示图形菜单需要的库, 若已经安装则不需要装。
sudo apt-get install libncurses5-dev
打开配置菜单, 输入下面的指令,如下图所示。
make menuconfig
-
配置 Target options
Target options -> Target Architecture = ARM (little endian) -> Target Binary Format = ELF -> Target Architecture Variant = cortex-A7 -> Target ABI = EABIhf -> Floating point strategy = NEON/VFPv4 -> ARM instruction set = ARM -
配置交叉编译工具链 Toolchain
这里不使用 Linux 驱动指南里的交叉编译器,内核 uboot 这些与根文件系统不使用同一个编译器也是没有关系的, 所以为了省事,我们使用 Buildroot 里面的 ARM 编译器即可,后面编译qt项目文件时候也可以直接使用Buildroot的qmake编译,这样可以最大限度减少出错的概率。
Toolchain -> Toolchain type (Buildroot toolchain) = Buildroot toolchain -> GCC compiler Version (gcc 9.x) = gcc 9.x -> [*] Enable toolchain locale/i18n support -> [*] Enable C++ support -> [*] Enable MMU support (NEW)在选择Kernel Headers 内核版本时候,可能会在之后的编译时候下载不到相应的版本的内核源文件,所以这里需要手动修改,首先在编译失败时候会提示从哪个网站下载失败,我们手动复制网址进入查看所有的Linux源码的版本,选择Manually specified Linux version ,在下面的选项中选择一个在网址中存在的Linux版本填到其中,这样就可以下载得到源码文件。

-
配置 Qt 编译选项
配置 Qt 选项, 这里配置的选项有 Qt 的 gui 模块、 Qt sql 模块、 QtChart 模块、 Quick 模块、Qt 虚拟键盘和 Qt 触摸插件 Tslib。可以看到像 tslib 插件这种第三方库可以在 Buildroot 里轻松配置, 我们就不用单独的一个个移植第三方库了。
Target packages-> ->Graphic libraries and applications (graphic/text) ---> -> [*] Qt5 ---> -> [*] Compile and install examples (with code) -> [*] MySQL Plugin ->SQLite 3 support (Qt SQLite) = Qt SQLite -> [*] widgets module -> [*] GIF support -> [*] qt5charts -> [*] Enable Tslib support -> [*] qt5quickcontrols -> [*] qt5quickcontrols2 -> [*] qt5virtualkeyboard -
配置 System configuration
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。
System configuration -> System hostname = atkbuildrootQtfs //平台名字,自行设置 -> System banner = Welcome to alientek Qt rootfs //欢迎语 -> Init system = BusyBox //使用 busybox -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev -> [*] Enable root login with password (NEW) //使能登录密码 -> Root password = root //登录密码为 root在 System configuration 选项中可以配置平台名字,登录密码等信息。可以看出 buildroot里面可以设置登录密码,实际测试时候取消掉登陆密码设置还是会在启动完成后要求输入名字密码。
-
配置 Filesystem images
此选项配置我们最终制作的根文件系统为什么格式的
Filesystem images -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4 -> ext2/3/4 variant = ext4 //选择 ext4 格式 -> exact size =1G //ext4 格式根文件系统 1GB(根据实际情况修改) -> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs -
禁止编译 Linux 内核和 uboot
默认没有配置,可以不用管。
-
配置 Build options
Buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要配置国内的加速镜像源url地址,速度可以快非常多!!
Build options -> Mirrors and Download locations -> (https://sources.buildroot.net) Backup download site -> (https://mirror.bjtu.edu.cn/kernel/) Kernel.org mirror -> (http://mirrors.nju.edu.cn/gnu/) GNU Software mirror -> (https://luarocks.cn) LuaRocks mirror -> (http://mirrors.nju.edu.cn/CPAN/) CPAN mirror (Perl packages)
1.3 构建 Buildroot
输入 make -j x 进行构建, time 用于计算时间。 x 参数根据个人 Ubuntu 配置取值。或者直接输入 make。
make -j 12
构建成功后输入如下命令查看生成根文件系统
ls output/images/
2、测试 Buildroot Qt 根文件系统
将生成的 rootfs.tar 替换到 I.MX6U TF 卡系统启动卡的 rootfs 分区,先删除 rootfs 的根文件系统文件再解压过去,也可以通过将 rootfs.tar 解压到nfs的rootfs目录,通过 nfs 挂载等方法测试生成的 Buildroot 根文件系统。
2.1 配置 Qt 的运行环境变量
由于 Qt 编译后相关的库都在/usr/lib/下,所以像配置 Qt 库的路径的环境变量也不需要再设置了。在/etc/profile 文件里加入以下内容, 指定 Qt 运行的平台插件即可。如需要显示文字,就需要字库了。 编辑 /etc/profile 在末尾添加 export QT_QPA_FONTDIR=/usr/share/fonts。请自行将 windows 下的(路径 C:\Windows\Fonts)下的中文字库放到新建一个 /usr/share/fonts/目录下就可以了。若例程有使用到字符,会显示找到不字库。注意 Windwos的字库仅为个人学习使用,不要用于商业用途!很多都是有版权的!我们可以使用宋体, 因为宋体免费。
vi /etc/profile
PS1='[\u@\h]:\w$:'
export PS1
# 顺序乱了会出问题
export QT_QPA_FONTDIR=/usr/share/fonts # 指定 QT 字体目录
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export QT_QPA_FB_TSLIB=1 # 启用 QT QPA 的 tslib 支持
export TSLIB_CONFFILE=/etc/ts.conf # TSLIB 配置文件路径
export TSLIB_PLUGINDIR=/usr/lib/ts/ # TSLIB 插件目录
# 下面这些还没有测试是不是必须添加的,目前没有添加是能够正常运行的
export QT_ROOT=/usr/lib/qt # QT 的根目录
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins # 指定 QT 平台插件路径
export QT_PLUGIN_PATH=$QT_ROOT/plugins # 指定 QT 插件路径
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms # 指定共享库加载路径,包括 QT 的 lib 目录和平台插件目录
export QML2_IMPORT_PATH=$QT_ROOT/qml # 指定 QML 导入路径
使能 Qt 运行环境变量, 下次开机就不用再 source 了, 开机会运行 profile 里的环境变量。
source /etc/profile
2.2 测试 tslib 能否正常触摸
我们先输入 ts_test 指令测试能否正常画线, 能正常画线就代表能触摸, 也就不用再配置了。
ts_test
触摸屏上点击 Draw 测试能够画出线条,且位置准确,说明 tslib 配置正常。
2.3 测试 Qt 能否正常运行
编译好的 Qt 例子的路径为 /usr/lib/qt/examples/ 。那么我们就直接执行里面的例子程序。我们选择了如下路径的一个可执行程序来执行。
/usr/lib/qt/examples/widgets/animation/animatedtiles/animatedtiles
运行的界面如下,点击右下角的按钮,触摸也有反应。
3、 编译 Qt 项目
使用 Buildroot 里的交叉编译工具链编译 Qt 项目。 我们需要知道,编译的 Qt 项目需要与编译 Buildroot Qt 根文件系统为同一个编译器。 否则可能会报版本不对应之类的错误。
3.1 查看 Qt 版本
输入如下指令查看 Qt 版本。
output/host/usr/bin/qmake -v
可以看到上面的结果为 Qt 5.15.8 版本。查看板子上面的Qt版本也是 Qt 5.15.8 那这个样子就是版本正确的。
3.2 命令行交叉编译 Qt 项目
随意进入一个 Qt 项目路径下,路径下必须有 xx.pro 文件, 如下面笔者家目录下有一个 untitled 的 Qt 项目。然后执行下面的指令。注意要改为自己的 Buildroot 的路径。
/home/linux/buildroot/buildroot-2022.02.3/output/host/usr/bin/qmake
上面执行 qmake 后,会生成 Makefile 用于编译,我们就直接输入 make 编译即可!非常简单!
make
编译完成如上图, 编译信息可能会报一些警告,这是因为编译器 g++版本与使用的 c++版本有差异,编译不报错即可!将生成的untitled拷贝到我们的Buildroot Qt根文件系统执行即可!
评论区