在Qt上写了一个程序使用Qt的MQTT模块,实现图形化实时显示温度,并提供UI接口更改网络设置。程序的目标平台是树莓派,所以需要用到交叉编译。
本篇文章将介绍如何在虚拟机Ubuntu18.04环境下交叉编译Qt程序
一、下载交叉编译器
这里直接使用apt-get install安装交叉编译工具链,免去了对交叉编译工具链的一些环境配置
执行命令sudo apt-get install gcc-arm-linux-gnueabihf
安装gcc交叉编译套件
执行命令sudo apt-get install g++-arm-linux-gnueabihf
安装g++交叉编译套件
执行arm-linux-gnueabihf-gcc -v
可以看到gcc交叉编译器的版本信息,说明安装成功。
执行arm-linux-gnueabihf-g++ -v
可以看到版本信息,说明安装成功。
二、交叉编译Qt源码
1)下载Qt源码
Qt官方下载地址:https://download.qt.io/archive/qt/
找到你需要的版本,点进去,源码在single文件夹下。
因为我准备交叉编译的程序就是用Qt5.12.9写的,所以我这里也下载Qt5.12.9的源码。
2)修改源码配置文件
执行tar -xvJf qt-everywhere-src-5.12.9.tar.xz
解压
进入qt-everywhere-src-5.12.9/qtbase/mkspecs修改linux-arm-gnueabi-g++的qmake的配置文件
更改前的qmake.conf文件
指定交叉编译套件,更改后的qmake.conf文件
3)编译Qt源码
到qt-everywhere-src-5.12.9文件夹执行下面的命令,命令有点长,写了一个脚本build.sh来执行。chmod a+x build.sh
然后./buildsh
。
#!/bin/bash
PRJ_PATH=`pwd`
LIBS_PATH=$PRJ_PATH/install
QT_INST_PATH=/opt/qt5.12.9.rpi
./configure -prefix ${QT_INST_PATH} \
-opensource \
-confirm-license \
-shared \
-strip \
-xplatform linux-arm-gnueabi-g++ \
-make libs \
-no-opengl \
-no-cups \
-no-libproxy \
-no-avx \
-no-mtdev \
-no-rpath \
-no-glib \
-no-xcb \
-pch \
-qt-freetype \
-qt-zlib \
-qt-libpng \
-qt-libjpeg \
-linuxfb \
-qpa linuxfb \
-I${LIBS_PATH}/include/ \
-L${LIBS_PATH}/lib/ \
-I${QT_INST_PATH}/include/ \
-L${QT_INST_PATH}/lib/
配置成功后执行make -j8
编译Qt库,时间很久,漫长的等待…
编译完成后执行make install
安装Qt,就完成了Qt源码编译。
三、使用qmake交叉编译项目文件
由于我们的项目需要用到MQTT模块,所以先用上一步编译生成的qmake编译git上下载的MQTT模块:qtmqtt.pro文件。
pro文件用来告诉qmake如何生成该项目的Makefile。如该项目有哪些源文件和头文件,该程序的特殊配置,比如需要链接的额外的库,或者一个额外的包含路径,这些都在pro文件中。
qmake后生成了Makefile文件,执行make
报错找不到头文件,这是因为我们刚才交叉编译的qt的include文件夹中没有相关的头文件。解决办法是将下载的模块src文件中的头文件全部拷贝到交叉编译的qt中
先在include中创建一个QtMqtt的文件夹,并将.h文件都拷贝进去,然后将QtMqtt移到qt的include中
再来make,这次mqtt模块编译成功,生成了我们需要的库和模块文件
将源码编译生成的文件加入到qt的安装路径对应的文件中,不然我们的项目qmake时会报错Unknown module(s) in QT: mqtt找不到MQTT模块
将生成的6个文件拷贝到qt的lib中
再将生成的.pri拷贝到qt的mkspecs/modules中
现在来编译我们的项目,同样是先qmake生成makefile,再make编译项目
自此,在虚拟机Ubuntu18.04上交叉编译树莓派项目成功!
下一篇:Qt交叉编译的程序打包到树莓派上运行