《【北京迅为】itop-3568 开发板文件系统构建手册v1.0.pdf》学习笔记
下载 QT 源码
QT 源码下载地址:https://download.qt.io/archive/qt/
我所下载的版本是 5.15.2:
编译 QT 库
解压源码
将 QT 源码压缩包复制到虚拟机开发环境中,使用 tar -vxf qt-everywhere-src-5.15.2.tar.xz
进行解压:
确认交叉编译器
确认当前环境变量中已经添加交叉编译器路径,
修改 qmake.conf
进入 qt 源码根文件目录,修改 qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 文件,将 arm-linux-gnueabi
替换成我当前开发环境中使用的交叉编译器名称(如果用 vim 替换,可以参考下图),
该文件需要修改的地方包括下面两个区域,根据自己实际情况更改,
配置编译选项
编译项配置通过根目录下的 configure 配置,执行 ./configure --help 可以查看可配置项,
由于需要配置的项目太多,所以我们可以将需要的配置项写成一个脚本,创建 autoconfigure.sh
,将下面的内容添加到该脚本内,
#!/bin/sh
./configure \
-v \
-prefix /opt/qt5.15.2 \
-confirm-license \
-opensource \
-release \
-xplatform linux-aarch64-gnu-g++ \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qt3d \
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdoc \
-skip qtgamepad \
-skip qtlocation \
-skip qtmacextras \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtremoteobjects \
-skip qtscript \
-skip qtscxml \
-skip qtsensors \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qttranslations \
-skip qtwayland \
-skip qtwebengine \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-skip qtxmlpatterns \
-make libs \
-make examples \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-I/opt/tslib1.4/include \
-L/opt/tslib1.4/lib \
-recheck-all
exit
脚本中的 tslib 库可以暂时不加(我还没编译 tslib),保存该脚本后,使用 chmod 777 autoconfigure.sh
修改脚本权限,然后执行脚本,
配置完成,
编译源码
输入 make 进行编译,我没有使用多线程编译,花了 1.5 小时完成编译,
安装(生成QT库)
使用 make install 进行安装,由于前面的配置将 QT 库的安装路径放到了 /opt,是系统目录,所以要 root 权限,
下面是我使用 sudo make install 的结果,依然没成功,
原来是我配置的全局交叉编译器只在当前用户生效(~/.bashrc),所以使用 sudo aarch64-linux-gnu-xxx 会提示找不到命令,
解决办法是先使用 sudo -s(该命令可以使用 root 权限的同时,保留 ~/.bashrc 里的环境变量),然后直接 make install,
安装完成,
此时安装目录下有以下几个文件夹,
将 QT 库移植到文件系统
拷贝 QT 库
根文件系统是上一篇笔记中制作的,将刚才编译好的 QT 库复制到根文件系统的 /opt/ 目录下(没有该目录的话需要新建),
拷贝字库
字库文件需要我们手动复制,我们可以直接将 Windows 系统下的字库文件拷贝到最小系统中,
我将字库目录放到了根文件系统的 /lib 目录,
配置 QT 环境变量
下面的 QT 环境变量参考原文档,由于我还没移植 tslib,所以只添加了 QT 的基本环境变量,不包括触摸屏相关配置,
#QT 基本配置
export QT_ROOT=/opt/qt5.15.2
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_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
将 rootfs 打包成镜像
移植完 QT 后,根文件系统已经由 64M 变为 719M,然后按照下面的步骤制作 rootfs.ext4,
将 rootfs.ext4 挂载到 rootfs/,然后将根文件系统的所有文件拷贝到 rootfs/,取消挂载后,将 roofs.ext4 复制成 rootfs.img,
最后,通过相关工具将 rootfs.img 烧录到开发板上。
测试 QT 库
这里我用 QT 的一个官方 demo 做测试,在虚拟机的 Qt Creator 软件上编译出一个可执行程序,然后拷贝到开发板上,
运行该程序,没有报缺库的错误,所以我们移植的 QT 库是没问题的,
程序虽然运行了,但却看不到字体,
原来是环境变量的配置出了问题,我并没有把字库文件放到 QT 库目录,而是放到了系统库目录,所以需要修改 QT_QPA_FONTDIR
环境变量值,
重启或者执行 source /etc/profile 后,再次运行 charactermap 例程,此时已经能够正常显示字体。