没志青年
发布于 2025-09-08 / 20 阅读
0

Linux 移植 QT5 库(ARM)

下载并解压

经过别人的测试,I.MX6ULL 对 Qt5.12.9 的支持比较好。

下载 Qt5.12.9 并解压

tar -vxf qt-everywhere-src-5.12.9.tar.xz

修改 qmake.conf 配置文件

修改 qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 配置文件

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# 添加以下内容,IMX6ULL采用cortex-A7核,使用armv7指令集,不同的平台下需要更改。
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
QMAKE_CXXFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard

# 修改成自己的交叉编译工具
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_NM                = arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = arm-linux-gnueabihf-strip
load(qt_config)

配置 configure

这个的配置太长了,因此写一个 shell 脚本管理。

在这里面指定了安装路径、控制了编译的时候需要哪些库和不要哪些库。

#!/bin/bash
./configure -prefix $PWD/build \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-arm-gnueabi-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 \
-tslib \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-tslib \
-I/Embbed_WorkSpace/lib/tslib-1.23/build/include \
-L/Embbed_WorkSpace/lib/tslib-1.23/build/lib \
-recheck-all

执行

chmod +x configure.sh
./configure.sh

可能出现的错误

error: expected primary-expression before '(' token
error: 'numeric_limits' is not a member of 'std'
error: expected primary-expression before '>' token
error: '::min' has not been declared; did you mean 'std::min'?

在这几个头文件中

  • qtbase/src/corelib/global/qendian.h

  • qtbase/src/corelib/tools/qbytearraymatcher.h

  • qtbase/src/tools/moc/generator.h

  • qtdeclarative/src/qml/jsruntime/qv4propertykey_p.h

添加头文件

#include <limits>

QT编译报这个错误,不知道为什么,gcc4.9.4、5.5.0、7.5.0都试过了都不行,这应该和 gcc 版本无关,根据上面修改就行了,但是别人都不报错,好奇怪。

编译 QT

在编译前还需干件事情,给 Python3 建立软链接,否则编译会找不到 Python3 报错。

ln -s /usr/bin/python3 /usr/bin/python

编译并且只输出错误信息

make -j4 2>&1 | grep -i error

注意:编译的时候会提示一大堆 rcc 错误,不要管,这是编译之后才有的一堆文件,另外出现警告信息无所谓,只要不是 Error 就行了。

make install

移植 QT 到根文件系统

移植 qt 就是把 qt 程序运行所需要的库添加到根文件系统

在开发板上创建 Qt 目录,并把编译后的库拷贝到这里。

然后删除一些不需要的文件

rm -rf *.la *.a *.prl
rm -rf cmake pkgconfig

删减完后还有很多库,这些根据具体的项目来做删减。

添加中文字体库到 QT

下载中文字体:wqy-zenhei-0.9.45.tar.gz

解压:

tar -xvf wqy-zenhei-0.9.45.tar.gz

注意,要把所有文件放在 fonts 文件夹下,像这样

fonts
├── 43-wqy-zenhei-sharp.conf
├── 44-wqy-zenhei.conf
├── AUTHORS
├── ChangeLog
├── COPYING
├── debsrc
│   ├── control
│   ├── postinst
│   ├── postrm
│   └── prerm
├── i18n
│   ├── en
│   │   └── wqy-zenhei.po.orig
│   ├── zh
│   │   ├── wqy-zenhei.mo
│   │   └── wqy-zenhei.po
│   ├── zh_CN
│   │   ├── wqy-zenhei.mo
│   │   └── wqy-zenhei.po
│   ├── zh_HK
│   │   ├── wqy-zenhei.mo
│   │   └── wqy-zenhei.po
│   ├── zh_MO
│   │   ├── wqy-zenhei.mo
│   │   └── wqy-zenhei.po
│   └── zh_TW
│       ├── wqy-zenhei.mo
│       └── wqy-zenhei.po
├── INSTALL
├── Makefile
├── pixmap
│   └── wqy-zenhei-cfg.png
├── README
├── rpmsrc
│   └── wqy-zenhei-fonts.spec
├── wqypkg
│   ├── wqydebcopy.sh
│   ├── wqydebmkdir.sh
│   ├── wqyrpmcopy.sh
│   └── wqyrpmmkdir.sh
├── wqy-zenhei-cfg
├── wqy-zenhei.ttc
├── zenhei-config.desktop
└── zenheiset

在根文件系统的 /etc/profile 中配置环境变量

#qt 库所在的路径
export QT_ROOT=/Qt
#指定触摸设备
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
#qt 字库的目录
export QT_QPA_FONTDIR=$QT_ROOT/fonts
#qt 插件的目录
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
#指定LCD帧缓冲设备/dev/fb0
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
#qt 插件的目录
export QT_PLUGIN_PATH=$QT_ROOT/plugins
#指定qml
export QML2_IMPORT_PATH=$QT_ROOT/qml
#使用 tslib 库
export QT_QPA_FB_TSLIB=1 
#打开应用程序运行的时候输出的log信息 
export QT_DEBUG_PLUGINS=1
#运行Qt程序之前先加载ts库
export LD_PRELOAD=$T_ROOT/lib/libts.so
#添加Qt库到系统环境变量
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms:$LD_LIBRARY_PATH

编译项目和运行测试

在项目目录下 qmake xxx.pro 生成 Makefile

然后 make 编译成可执行文件

make CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld

这里要注意 pro 文件中指定的 C++ 版本你的交叉编译工具能否满足。

运行 qt 可执行文件

./application

在后台运行

./application >/dev/null 2>&1 &