下载编译器
这里面版本很多,主要是大小端、armv7/armv8、32/64位、裸机/linuxdeng区别
对于32位平台,下载如下,
对于64位平台,下载如下,
将编译器解压、重命名和复制到指定目录,
32位平台的编译器gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz操作如下
解压命令:
$ tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
重命名命令:
$ mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf arm-linux-gnueabihf-7.5.0
将目标复制到/opt目录下,
$ sudo cp -rf arm-linux-gnueabihf-7.5.0/ /opt
64位平台的编译器gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz操作如下
解压命令:
$ tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
重命名命令:
$ mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu aarch64-linux-gnu-7.5.0
将目标复制到/opt目录下,
$ sudo cp -rf aarch64-linux-gnu-7.5.0/ /opt
安装完成后,还需要手动添加环境变量,修改/etc/bash.bashrc文件
$ sudo vim /etc/bash.bashrc
在文件的最后添加如下命令:
#32位arm编译器
PATH=$PATH:/opt/arm-linux-gnueabihf-7.5.0/bin
#64位arm编译器
PATH=$PATH:/opt/aarch64-linux-gnu-7.5.0/bin
然后立即生效,
$ source /etc/bash.bashrc
检查一下配置情况,
$ arm-linux-gnueabihf-gcc –v
$ arm-linux-gnueabihf-g++ -v
$ aarch64-linux-gnu-gcc –v
$ aarch64-linux-gnu-g++ -v
下载Qt源码包
因为后面要在开发板上跑qt程序,所以必须下载qt源码包,然后用交叉编译工具进行编译,才能得到在目标平台上可以运行的qt SDK
我下载的是5.12.1版本:qt-everywhere-src-5.12.1.tar.xz
下载地址:Index of /archive/qt/5.12/5.12.1/single
定义Qt5.12.1的SDK路径
编译前确定好SDK路径。因为我需要编译两个版本,所以,我建了两个目录, /opt/qt-5.12.1-arm用来存放32位的,/opt/qt-5.12.1-arm64用来存放64位的
$ sudo mkdir qt-5.12.1-arm
$ sudo mkdir qt-5.12.1-arm64
解压qt源码
$ tar xvf qt-everywhere-src-5.12.1.tar.xz
切换路径
$ cd qt-everywhere-src-5.12.1/
修改qmake.conf
对于32位平台:
修改文件./qt-everywhere-src-5.12.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
原始的编译器环境为:
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabi-gcc
QMAKE_CXX = arm-linux-gnueabi-g++
QMAKE_LINK = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy
QMAKE_NM = arm-linux-gnueabi-nm -P
QMAKE_STRIP = arm-linux-gnueabi-strip
load(qt_config)
将其修改成自己的编译器环境,如下所示,
# modifications to g++.conf
QMAKE_CC = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /opt/arm-linux-gnueabihf-7.5.0/bin/arm-linux-gnueabihf-strip
load(qt_config)
对于64位平台:
修改文件./qt-everywhere-src-5.12.1/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
原始的编译器环境如下,
# modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
load(qt_config)
将编译器信息修改成自己的环境,如下所示,
# modifications to g++.conf
QMAKE_CC = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-gcc
QMAKE_CXX = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-g++
QMAKE_LINK = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-objcopy
QMAKE_NM = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP = /opt/aarch64-linux-gnu-7.5.0/bin/aarch64-linux-gnu-strip
load(qt_config)
当然,如果你下载的是其他交叉编译器,换成你对应的平台交叉编译器即可。如果不知道如何修改,可在终端上输入aarch64-linux-gnu-gcc -v,打印出来信息中有一行Target:后面的内容替换上面原内容中的arm-linux-gnueabi即可。
执行configure
编译32位
进入路径qt-everywhere-src-5.12.1中,执行configure命令,具体参数如下,
$ ./configure -release -nomake examples -no-iconv -no-opengl -no-assimp -no-qt3d-profile-jobs -no-qt3d-profile-gl -xplatform linux-arm-gnueabi-g++ -prefix /opt/qt-5.12.1-arm -opensource -confirm-license
这里,有很多配置项,简单说明下:
-prefix选项后面的路径就是第一步中定义的Qt SDK路径,对于不同的平台,注意目录要对应
-no-opengl -no表示不编译该模块
删掉了opengl、Qt3D相关的库、examples,编译他们三个可能会导致编译失败
还有一些参数,可以参考其它文章。
开始编译,
注意检查python环境,如果没有需要提前安装。
$ sudo make -j4
大概编译十来分钟
开始安装
$ sudo make install
完成后进入/opt/qt-5.12.1-arm/lib路径,可以查看文件属性,
$ readelf -h libQt5Xml.so
系统架构为ARM
编译64位,
进入路径qt-everywhere-src-5.12.1中,执行configure命令,具体参数如下,
$ ./configure -recheck-all -release -extprefix /opt/qt-5.12.1-arm64 -xplatform linux-aarch64-gnu-g++ -no-opengl -no-openssl -nomake tests -no-compile-examples -nomake examples -gif -ico -qt-libpng -qt-libjpeg -qt-sqlite
开始编译,
$ make -j4 2>&1 | tee build.log
开始安装
$ sudo make install
切换路径至/opt/qt-5.12.1-arm64/lib查询文件信息,
$ readelf -h libQt5Xml.so
系统架构为AArch64
测试
安装QT
下载qt-opensource-linux-x64-5.12.1.run图形化安装即可,此处不再赘述。
配置编译器
创建一个HelloWorld程序,默认会在GCC上编译,确保程序编译运行正常。
进入可执行程序目录,查看文件类型,如下所示,
- 配置32位ARM交叉编译器
C++
C
设置Qt版本
设置套件Kit
- 配置64位aarch64交叉编译器
C++编译器
C编译器
设置Qt的版本
设置套件Kit
选择Aarch64编译程序,并运行,结果如下,
显示的乱码笔者也不懂什么意思。
进入编译路径查询编译生成的二进制文件类型,如下所示,
而
参考文献
- Qt5.12.0 交叉编译搭建 - yydsLinux - 博客园 (cnblogs.com)
- https://blog.csdn.net/colinjen/article/details/114437873?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase