下载并解压
经过别人的测试,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 &