树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79710509

目录

前话

树莓派本地qt编译环境(不推荐)

步骤一:安装qt5

步骤二:配置qmake等构件套件

步骤三:创建一个GUI程序测试

步骤四:创建一个QtQuick程序测试

交叉编译传送文件FileZilla(使用sftp)

步骤一:ubuntu宿主上安装FileZilla

步骤二:配置连接树莓派ssh环境

树莓派Qt交叉编译环境(强烈推荐)

步骤一:下载树莓派的交叉编译工具链

步骤二:测试交叉编译工具链

步骤三:挂载树莓派文件系统

步骤四:安装ubuntu的qt(需要qmake和qtcreator)

步骤五:下载qt源码矫正库文件

步骤六:配置qt编译参数

步骤七:编译并安装qtbase

步骤八:检查qmake

步骤九:编译目标机程序并运行验证(qml缺少模块,需要编译其他模块)

步骤十:编译其他模块


树莓派开发专栏

《树莓派开发笔记(一):入手树莓派3b,成功运行树莓派系统》

《树莓派开发笔记(二):树莓派Qt编译和宿主机Qt交叉编译》

《树莓派开发笔记(三):更便捷的开发,windows下和ubuntu下远程桌面至树莓派》

《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上) 》

《树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键输入)》

《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)》

《树莓派开发笔记(七):GPIO口的SPI使用(BME280三合一传感器:测量温度、湿度、气压、海拔高度) 》

《树莓派开发笔记(八):GPIO口的I2C使用(BME280三合一传感器:测量温度、湿度、气压、海拔高度) 》

《树莓派开发笔记(九):CSI口的摄像头拍照(同样适用USB摄像头)》

《树莓派开发笔记(十):Qt读取ADC模拟量电压(ADS1115读取电压模拟量)》

 

    树莓派开发笔记(二):树莓派Qt编译和宿主机Qt交叉编译

 

前话

    前面已经成功运行树莓派,下面使用Qt开发树莓派。

 

树莓派本地qt编译环境(不推荐)

步骤一:安装qt5

    安装树莓派的桌面版本,可以直接配置qt环境,此种方法总是卡顿的,所以笔者不太推荐。(2019年9月,笔者再次尝试使用树莓派zero wh本地开发,一动卡3-5s,所以此方法只用于跑应用,不建议用于开发)

sudo apt-get update
sudo apt-get install qt5-default
sudo apt-get install qtcreator

(如果需要支持qml,需要下载qml的开发环境,使用以下命令)

sudo apt-get install qtdeclarative5-dev

       直接进入qtcreator

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第1张图片

步骤二:配置qmake等构件套件

       需要自己手动配置构建套件,配置qmake,gcc,g++,gdb。

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第2张图片

配置c和c++编译器

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第3张图片

       配置套件      

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第4张图片

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第5张图片

步骤三:创建一个GUI程序测试

       运行如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第6张图片

步骤四:创建一个QtQuick程序测试

       运行失败,如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第7张图片

       因为缺少相应的库,输入如下命令:

sudo apt-get install qtdeclarative5-dev

       安装完成后,运行如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第8张图片

 

交叉编译传送文件FileZilla(使用sftp)

步骤一:ubuntu宿主上安装FileZilla

       ubuntu上安装sftp工具,ubuntu软件中心搜索filezilla并进行安装。

步骤二:配置连接树莓派ssh环境

       树莓派和ubuntu在同一个局域网,打开filezilla软件,登录树莓派传送

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第9张图片

       登录成功,可以传送文件了。

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第10张图片

 

树莓派Qt交叉编译环境(强烈推荐)

安装ubuntu,是直接装系统还是使用虚拟机,大家看着办,笔记上虚拟机,笔者使用的系统是ubuntu14.04 amd64。

注意:笔者有偿提供已交缠编译树莓派qt的虚拟机包,经测试其程序可以在本篇系统也可以在最新的2019年的bluster系统上正常编译运行,可先验证测试是否可以运行。

下载测试程序运行地址:

步骤一:下载树莓派的交叉编译工具链

       使用git下载:

cd
mkdir ~/work
cd ~/work
sudo apt-get install git 
git clone git://github.com/raspberrypi/tools.git

       git时间有点漫长,请继续等待,总共约1.3GB(压缩包是800MB)左右,建议去其他地方下。

       下载下来后我们直接放到~/work/tools

       该工具链中包含了制作镜像的工具,编译器,测试代码等等,其实我们只用到了编译器,因ubuntu是64位的,所以使用x64的,若是32位,则直接使用不带x64尾缀下的即可。

步骤二:测试交叉编译工具链

       检测下编译器是否运行成功:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第11张图片

       将路径引入系统环境变量:

export PATH=$PATH:~/work/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

       测试

mkdir ~/work/project/testHello -p
cd ~/work/project/testHello
sudo apt-get install gedit
gedit main.c

       输入程序,并退出arm  保存

#include 
int main(int argc, char **argv)
{
    printf("Hello, you do it succeed!!!\n");
    return 0;
}

       然后编译

arm-linux-gnueabihf-g++ main.c

       输出a.out,准备放到目标机验证,使用FileZilla(参照FileZilla远程传送)传送a.out文件到是树莓派桌面(树莓派需要启动ssh服务,可参照《树莓派开发笔记(一):入手树莓派3b,成功运行树莓派系统》中的“配置ssh服务”。

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第12张图片

       下面打开另外一个终端,使用ssh远程登录,作为交叉编译的登录,我们创建测试文件夹,操作树莓派:

mkdir ~/qtProject/testCrossCompile -p
cd ~/qtProject/testCrossCompile
cp ~/Desktop/a.out .
./a.out

       输出语句,交叉编译程序成功。

步骤三:挂载树莓派文件系统

此处挂载树莓派文件系统,主要是对qt源码进行交叉编译时,需要的一些头文件和库的依赖。在后面使用qt的qmake交叉编译qt应用程序时,也会依赖一些库,如操作树莓派gpio则需要树莓派自带的本地库。

将《树莓派开发笔记(一):入手树莓派3b,成功运行树莓派系统》下载的树莓派系统2018-03-13-raspbian-stretch.img拷贝到ubuntu的桌面上,操作ubuntu。

mkdir ~/work/img
cd ~/ work /img
mv ~/Desktop/2018-03-13-raspbian-stretch.img .
sudo mkdir /mnt/pi-rootfs

       挂载主要分区,使用fdisk –l查看挂载分区

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第13张图片

       此处,若offset不对,mount会提示需要指定文件系统格式,所以要fdisk查看。

sudo mount -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch.img /mnt/pi-rootfs/

步骤四:安装ubuntu的qt(需要qmake和qtcreator)

    qmake默认会使用系统的qmake,因为版本等问题,可能会直接影响后面qt编译源码出现奇葩错误,所以下载直接可安装的包,并且同时安装了qctreaor用于开发树莓派qt程序的IDE。

sudo apt-get update
sudo apt-get install g++
sudo apt-get install libgl1-mesa-dev

       直接安装qt5.9.3

             

安装完成后,先创建一个gui程序,配置编译构建套并跑起来。

       树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第14张图片      

此时如下命令:

ls -l /usr/bin/qmake

       可发现连接的文件不存在。

       建立软连接

sudo ln -sf /home/yang/Qt5.7.1/5.7/gcc_64/bin/qmake /usr/bin/qmake

       检查确认一次

步骤五:下载qt源码矫正库文件

    桌面版本安装了qt5,那么我们就没必要自己配置了,下次也可以直接装qt5,最关键的点是,下载交叉编译的qt源码需要和树莓派对应,我们查看树莓派qt的版本,如下图,树莓派的qt版本是5.7.1。

    qt源码在下地址:http://download.qt.io/archive/qt

    下载5.7.1的源码,如果读者版本不一样自己下载对应版本的源码。

       将源码拷贝到~/work下,没有该目录就创建。

cd ~/work
tar xvf qt-everywhere-opensource-src-5.7.1.tar.gz
mv qt-everywhere-opensource-src-5.7.1 qt5.7.1

       此处配置下系统,如果是32位则无需配置,是64位则需要添加32位支持

sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

       获取交叉编译

git clone https://github.com/darius-kim/cross-compile-tools.git

       矫正库文件

cd cross-compile-tools
sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ ~/work/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc

步骤六:配置qt编译参数

       下面对qt进行配置

cd ~/work/qt5.7.1/qtbase
./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot /mnt/pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt5pi -hostprefix /usr/local/qt5pi -v

       注意:-sysroot是编译时参照的根目录,-prefix是带上sysroot相对参照根目录的目录,而-hostprefix是对于主机系统的目录。所以以上配置路径详解为下:

       编译时查找/usr/inclue/test.h头文件:会查找/mnt/pi-rootfs/usr/include/test.h;

       安装时安装到文件路径(prefix):/mnt/pi-rootfs/usr/local/qt5pi,主要是目标机的库文件,插件等等,会自动分开装为prefix和hostprefixe;

       安装时安装到文件路径(hostprefix):/usr/local/qt5pi,主要是主机编译用。

       配置过程出现错误如下:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第15张图片

       切换一个终端查找树莓派下的libglesv2,是有的,如下图:

       建立一个软连接

cd /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf
sudo ln -sf libGLESv2.so.2 libGLESv2.so

       切回配置qt的终端,继续配置,配置完成

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第16张图片

步骤七:编译并安装qtbase

       使用make –j4,make过程也是先前出现g++,后续为arm-linux-gnueabihf-g++。

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第17张图片

       出现错误,找不到libz.so,librt.so,libm.so,如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第18张图片

       经过查看其实是有这三个库的,只是因为他们是符号链接到/usr/lib所以出错了,如下图:

       执行指令:

cd /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf
sudo ln -sf /mnt/rasp-pi-rootfs/lib/arm-linux-gnueabihf/libm.so.6 libm.so
sudo ln -sf /mnt/rasp-pi-rootfs/lib/arm-linux-gnueabihf/librt.so.1 librt.so
sudo ln -sf /mnt/rasp-pi-rootfs/lib/arm-linux-gnueabihf/libz.so.1.2.8 libz.so

       继续make -j4,编译完成

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第19张图片

       安装sudo make install,安装完成,下面编译其他模块,最好按照顺序编,之前笔者一直整体编译,总是出现各种问题,入坑约1天多的时间。

步骤八:检查qmake

       检查qmake是否成功安装(应该是有参数-hostprefix决定,不带sysroot前缀,而prefix带sysroot)。

ls /usr/local/qt5pi/bin/qmake

       找到qmake,可以交叉编译其他模块。

       先把qmake文件夹复制到/usr/local/qt5pi

sudo cp -arf ~/work/qt5.7.1/qtbase/bin /mnt/rasp-p-rootfs/usr/local/qt5pi/
/mnt/rasp-pi-rootfs/usr/local/qt5pi/bin/qmake -v

       在交叉编译其他模块前,验证以下qt交叉编译是否可以成功编译目标机上的程序。

步骤九:编译目标机程序并运行验证(qml缺少模块,需要编译其他模块)

       下面打开qtcreator创建一个工程,来检测是否可以交叉编译。

       配置交缠编译构建套件

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第20张图片

       主要是qmake最为关键:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第21张图片

       创建一个testWidget项目交叉编译。

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第22张图片

       编译后无法运行,打开终端运行文件并查看文件

       表示我们成功了一大半,然后放到树莓派上桌面上运行,如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第23张图片

       运行成功,如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第24张图片

步骤十:编译其他模块

       编译其他交叉编译的模块,这里笔者将交缠编译所有模块,因为作为开发机全一点比较好,部署时需要哪个就哪个,避免其他项目可能导致的需要重新编模块,对于大部分人,交叉编译都是有点麻烦的。

cd ~/work/qt5.7.1/
/usr/local/qt5pi/bin/qmake
make -j4
sudo make install

       重新使用目标平台的qmake扫一遍所有模块(之前qtbase已配置好),然后make,编译。

       在编译模块qtdeclarattive过程中,出现错误,如下图:

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第25张图片

       修改源码

cd ~/work/qt5/qt-everywhere-opensource-src-5.7.1/qtdeclarative/src/qml/qml
gedit qqmlmemoryprofiler.cpp

       搜索static bool openLibrary()

       在#ifndef QT_NO_LIBRARY上添加一句#define QT_NO_LIBARRY

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第26张图片

       编译完成

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第27张图片

       建议多make两次,仅make。

       然后make install

树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译_第28张图片

       至此5.7.1所有源码交叉编译完美完成。

       查看prefix目标机,sysroot/prefix,bin是用于宿主机编译目标机的,实际不能直接编,缺少mkspec配置编译器,我们忽略bin目录(以hostprefix为主)。

,

       查看hostprefix主机,主要是编译编译工具。


原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79710509

你可能感兴趣的:(Qt开发专栏,树莓派开发专栏)