QT5.15.6 编译移植记录
准备
QT5.15.6源码: https://download.qt.io/archive/qt/5.15/5.15.6/single/qt-everywhere-opensource-src-5.15.6.tar.xz
PC系统:VMware装的ubuntu
交叉环境:
芯片:全志R818
工具链:aarch64-openwrt-linux-gnu
编译
我不想全部编译,因为很多模块我根本用不上,也懒得直接在源码目录下编译,因为写配置脚本时要跳过的模块太多了
编译核心模块 qtbase
- 解压源码
- 进入源码
./qtbase/mkspecs
目录,因为没有我需要的配置,所以需要自已配; - 随便复制一分配置文件夹,我复制的
linux-aarch64-gnu-g++
并重命名为r818
- 进入
./qtbase/mkspecs/r818
文件夹,修改 ‘qmake.conf‘ 文件,将工具链修改成r818的交叉工具链,建议末尾加上LIBS=-ldl
#
# qmake configuration for building with aarch64-linux-gnu-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = aarch64-openwrt-linux-gnu-gcc
QMAKE_CXX = aarch64-openwrt-linux-gnu-g++
QMAKE_LINK = aarch64-openwrt-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-openwrt-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = aarch64-openwrt-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-openwrt-linux-gnu-objcopy
QMAKE_NM = aarch64-openwrt-linux-gnu-nm -P
QMAKE_STRIP = aarch64-openwrt-linux-gnu-strip
load(qt_config)
LIBS=-ldl
注:交叉工具链路径须加入系统环境变量(也可以在qmake.conf
采用绝对路径),例如:
# r818 toolchain config
export PATH=${PATH}:/opt/r818/toolchain/bin
export STAGING_DIR=${STAGING_DIR}:/opt/r818/toolchain/bin
- 进入源码
./qtbase
目录,创建自动配置脚本autoconfig.sh
,编辑配置信息,配置参数可通过configure --help
命令查看。
#!/bin/sh
./configure \
-release \
-xplatform r818 \
-confirm-license \
-opensource \
-shared \
-no-openssl \
-no-opengl \
-qt-zlib \
-no-iconv \
-nomake examples \
--prefix=/opt/r818/Qt-5.15.6
其中
-xplatform 是
./qtbase/mkspecs
中指定的交叉工具链配置目录,我用的自已配的r818
--prefix 为工具链想要安装的位置,我安到了
/opt/toolchain/r818/Qt-5.15.6
- 执行
sh autoconfig.sh
来生成 Makefile 文件 - 执行
make -j8
编译 - 执行
make install
安装工具链到--prefix
指定的位置
编译安装成功后,在--prefix
指定的安装目录下,可看到生成的qt工具链,其中.\bin\qmake
为qt交叉编译的qmake工具,后面会使用
编译qml相关模块
要运行qml需要编译 qtdeclarative、qtsvg、qtquickcontrols、qtquickcontrols2模块
编译qtdeclarative
- 进入源码
./qtdeclarative
目录,在此目录打开终端执行/opt/r818/Qt-5.12.9/bin/qmake
来生成 Makefile 文件, 其中/opt/toolchain/r818/Qt-5.15.6
为前面编译qtbase时--prefix
所指定的位置。 - 执行
make
编译 - 执行
make install
安装工具链到前面编译qtbase时--prefix
指定的位置里。
编译qtsvg
- 进入源码
./qtsvg
目录,在此目录打开终端执行/opt/r818/Qt-5.12.9/bin/qmake
来生成 Makefile 文件, 其中/opt/toolchain/r818/Qt-5.15.6
为前面编译qtbase时--prefix
所指定的位置。 - 执行
make -j8
编译 - 执行
make install
安装工具链到前面编译qtbase时--prefix
指定的位置里。
编译qtquickcontrols
- 进入源码
./qtquickcontrols
目录,在此目录打开终端执行/opt/r818/Qt-5.12.9/bin/qmake
来生成 Makefile 文件, 其中/opt/toolchain/r818/Qt-5.15.6
为前面编译qtbase时--prefix
所指定的位置。 - 执行
make -j8
编译 - 执行
make install
安装工具链到前面编译qtbase时--prefix
指定的位置里。
编译qtquickcontrols2
- 进入源码
./qtquickcontrols2
目录,在此目录打开终端执行/opt/r818/Qt-5.12.9/bin/qmake
来生成 Makefile 文件, 其中/opt/toolchain/r818/Qt-5.15.6
为前面编译qtbase时--prefix
所指定的位置。 - 执行
make -j8
编译 - 执行
make install
安装工具链到前面编译qtbase时--prefix
指定的位置里。
编译虚拟键盘模块
虚拟键盘模块依赖qml,所以应先编译qml
- 进入源码
./qtvirtualkeyboard
目录,在此目录打开终端执行/opt/r818/Qt-5.12.9/bin/qmake
来生成 Makefile 文件, 其中/opt/toolchain/r818/Qt-5.15.6
为前面编译qtbase时--prefix
所指定的位置。 - 执行
make -j8
编译 - 执行
make install
安装工具链到前面编译qtbase时--prefix
指定的位置里。
配置工具链
配置qt creator
qt creator安装没啥说的,用qt的通常都已装了
- 打开qt creator,在 tool->option->qt Versions 里面选择添加自己刚刚编译好得qmake
- 在 tool->option->编译器 里选择添加自已的gcc/g++等交叉工具链
- 在 tool->option->构建套件(Kit) 里添加新套件,其中 Compiler中 C 和 c++ 选刚才添加的gcc/g++等交叉工具链,qt Versions选刚添加的qt Versions
配置开发板
裁剪库
- 将前面安装的工具链目录复制一份并重命名为(就是前面编译qtbase时
--prefix
指定的目录。 - 进入复制的目录
- 将目录中除lib、plugins、qml以外的目录删除
进入lib中,删除cmake、metatypes、pkgconfig目录,删除非动态库文件
rm -rf cmake metatypes pkgconfig *.prl *.a *.la
如此我们便得到了一份简单裁剪库,将其推送到开发板中,我推送到了 opt/r818/Qt-5.15.6
中。
如果开发发板没有字库的话,可以在目录中新建fonts文件夹并从网上下载字库放入,方便统一管理。
配置开发板QT环境
通过vi或vim编辑开发板 /etc/profile 文件,在尾部加上以下配置
# qt config
export XDG_RUNTIME_DIR=/usr/lib/
export QTDIR=/opt/r818/Qt-5.12.7
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QML_IMPORT_PATH=$QTDIR/qml
export QML2_IMPORT_PATH=$QTDIR/qml
export QT_QPA_FONTDIR=$QTDIR/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:rotation=270
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event2:inverty
QTDIR :QT库推送到开发板的位置
/dev/fb0:需修改为实际显示屏接口
/dev/event1:需修改为实际触摸接口
如果触摸和方向不对,需修改 rotation 或 rotate 、inverty、invertx为实际旋转角度