一.问题起因
之前的QT程序在arm32处理器上用着没问题,但是在arm64上进程会卡死,可以kill掉重新运行,经过分析调试将问题大概定位在QThread中发出信号导致的。之后使用QT5.15.2编译使用没这个问题,但是程序兼容性有些问题,于是尝试在QT4上解决问题。
二.打入补丁
访问qt4-4.8.6\qt4\recipes-qt\meta - openembedded-core - OpenEmbedded Core layer
下载如下4个patch文件至解压后的源码目录,输入下面命令打入补丁(补丁是针对qt4.8.6版本的,我先在qt4.8.6版本上打入对应的补丁,然后编译验证不存在死机的问题,最后在qt4.8.6版本上根据补丁内容进行改动,问题也得到了解决。)
patch -p1 < 0029-aarch64_arm64_fix_arch_detection.patch patch -p1 < 0030-aarch64_arm64_qatomic_support.patch patch -p1 < 0031-aarch64_arm64_mkspecs.patch patch -p1 < 0032-aarch64_add_header.patc |
三.编译QT
1.将目录及内容mkspecs\qws\linux-arm-g++\ 拷贝一份,命名位mkspecs\qws\linux-aarch64-mix210-g++\;
2.修改mkspecs\qws\linux-aarch64-mix210-g++\qmake.conf文件,内容如下:
#
# qmake configuration for building with aarch64-mix210-linux-g++
#
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = aarch64-mix210-linux-gcc
QMAKE_CXX = aarch64-mix210-linux-g++
QMAKE_LINK = aarch64-mix210-linux-g++
QMAKE_LINK_SHLIB = aarch64-mix210-linux-g++
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS -std=gnu++98
QMAKE_CFLAGS += -march=armv8-a
QMAKE_CXXFLAGS += -march=armv8-a
# modifications to linux.conf
QMAKE_AR = aarch64-mix210-linux-ar cqs
QMAKE_OBJCOPY = aarch64-mix210-linux-objcopy
QMAKE_STRIP = aarch64-mix210-linux-strip
load(qt_config)
3.在QT源码根目录运行configure命令,详细参数如下:
./configure -opensource -confirm-license --prefix=/home/ubuntu/workspace/qt/4.8.7/linux-aarch64-mix210-g++ -xplatform qws/linux-aarch64-mix210-g++ -arch aarch64 -embedded aarch64 -qt-freetype -qt-mouse-pc -no-webkit -no-largefile -fast -release -no-qt3support -no-opengl -no-phonon -no-phonon-backend -no-scripttools -qt-libjpeg -no-libtiff -no-gif -no-libmng -no-nis -no-cups -no-svg -nomake examples -nomake demos -nomake docs -nomake tools
4.运行 make -j4 进行编译,"-j4"参数根据自己电脑处理器内核总数而定,经过几分钟编译完成;
5.运行 make install 进行安装,安装目录为第3步设置的prefix参数。
注意:如果切换编译器需要运行如下指令,特别是要删除.obj/ .pch/这两个目录,否则会遇到一些麻烦的错误:
make clean make confclean rm -rf .obj/ .pch/
四.结束
至此QT打补丁和编译安装完成,通过打补丁之后,编译过程顺畅,无需改动其它文件。
然后可以在Qt Creator中配置好上文编译好的Qt。
打补丁和将补丁移植到qt4.8.7上有点麻烦,大家需要的话可以私信我整理出来。
板端运行环境变量
export QT_ROOT=/app/qt4
export QT_PLUGIN_PATH=${QT_ROOT}/plugins
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:${QT_ROOT}/lib
export QT_QWS_FONTDIR=${QT_ROOT}/fonts
export QWS_DISPLAY=linuxFB:/dev/fb0
/app/mainwindow -qws