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

若该文为原创文章,未经容许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-wuksojww-mo.html
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么本身研究linux

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)c++

树莓派开发专栏(点击传送门)

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

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

 

前话

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

 

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

步骤一:安装qt5

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

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

(若是须要支持qml,须要下载qml的开发环境,使用如下命令)ssh

sudo apt-get install qtdeclarative5-dev

       直接进入qtcreator工具

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

       须要本身手动配置构建套件,配置qmake,gcc,g++,gdb。oop

配置c和c++编译器测试

       配置套件      

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

       运行以下图:

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

       运行失败,以下图:

       由于缺乏相应的库,输入以下命令:

sudo apt-get install qtdeclarative5-dev

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

 

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

步骤一:ubuntu宿主上安装FileZilla

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

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

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

       登陆成功,能够传送文件了。

 

树莓派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尾缀下的便可。

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

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

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

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 <stdio.h>
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服务”。

       下面打开另一个终端,使用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查看挂载分区

       此处,若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程序,配置编译构建套并跑起来。

             

此时以下命令:

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,主要是主机编译用。

       配置过程出现错误以下:

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

       创建一个软链接

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

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

步骤七:编译并安装qtbase

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

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

       通过查看实际上是有这三个库的,只是由于他们是符号连接到/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,编译完成

       安装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建立一个工程,来检测是否能够交叉编译。

       配置交缠编译构建套件

       主要是qmake最为关键:

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

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

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

       运行成功,以下图:

步骤十:编译其余模块

       编译其余交叉编译的模块,这里笔者将交缠编译全部模块,由于做为开发机全一点比较好,部署时须要哪一个就哪一个,避免其余项目可能致使的须要从新编模块,对于大部分人,交叉编译都是有点麻烦的。

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

       从新使用目标平台的qmake扫一遍全部模块(以前qtbase已配置好),而后make,编译。

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

       修改源码

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

       编译完成

       建议多make两次,仅make。

       而后make install

       至此5.7.1全部源码交叉编译完美完成。

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

,

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

 

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

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

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-wuksojww-mo.html