《树莓派入门(二)--Qt5.11.3+树莓派buster+ubuntu18.04交叉编译环境搭建》

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

   使用git下载:
cd
mkdir ~/raspi
cd ~/raspi
sudo apt-get install git 
git clone git://github.com/raspberrypi/tools.git

git时间有点漫长,请继续等待,总共约1.3GB(压缩包是600MB)左右,建议去其他地方下。
下载下来后我们直接放到~/raspi/tools
在这里插入图片描述
该工具链中包含了制作镜像的工具,编译器,测试代码等等,其实我们只用到了编译器,因ubuntu是64位的,所以使用x64的,若是32位,则直接使用不带x64尾缀下的即可。

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

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

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

测试


mkdir ~/raspi/project/testHello -p
cd ~/raspi/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服务,可参照《树莓派入门(一)–Ubutu18.04+Qt5.11.3 环境搭建》

在树莓派上运行

cp ~/Desktop/a.out .
./a.out

输出语句,交叉编译程序成功。在这里插入图片描述

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

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

将下载的树莓派系统2019-07-10-raspbian-buster-full.img拷贝到ubuntu的桌面上,操作ubuntu。

mkdir ~/raspi/img
cd ~/ raspi /img
mv ~/raspi/2019-07-10-raspbian-buster-full.img .
sudo mkdir /mnt/pi-rootfs

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

fdisk -l 2019-07-10-raspbian-buster-full.img

在这里插入图片描述
此处,若offset不对,mount会提示需要指定文件系统格式,所以要fdisk查看。

sudo mount -o loop,offset=$((540672*512)) 2019-07-10-raspbian-buster-full.img /mnt/pi-rootfs/

这边挂载的系统如果不是从树莓派上拷贝的镜像有可能会出错

另一种方法
树莓派环境配置
树莓派系统安装好以后需要升级树莓派!注意:是升级树莓派

sudo rpi-update
reboot

更新树莓派的源,保证后续文件安装的流畅性,不然官方源下载速度非常慢

编辑 /etc/apt/sources.list 文件,删除原文件所有内容,用以下内容取代:

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib

编辑 /etc/apt/sources.list.d/raspi.list 文件,删除原文件所有内容,用以下内容取代:

deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

更新软件源

sudo apt-get update

更新安装系统所需的库

sudo apt-get update
sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0

准备好qt文件安装的文件夹

sudo mkdir /usr/local/qt5pi
sudo chown pi:pi /usr/local/qt5pi

PC(Ubuntu)机上环境配置

创建工作文件夹并获取交叉编译工具

mkdir ~/raspi
cd ~/raspi
git clone https://github.com/raspberrypi/tools

建sysroot目录,利用 rsync 指令把树莓派的系统环境及库同步到此目录中. 其中需要将 raspberrypi.local 替换为树莓派的IP地址,通过局域网进行更新,前提是树莓派的SSH已经配置好

mkdir sysroot sysroot/usr sysroot/opt
rsync -avz pi@raspberrypi.local:/lib sysroot
rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt

目的是为了把 树莓派的一些库拷贝到虚拟机下编译

步骤四:下载qt源码

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

qmake -version

在这里插入图片描述
qt源码在下地址:http://download.qt.io/archive/qt

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

cd ~/raspi
tar xvf qt-everywhere-src-5.11.3.tar.xz
mv qt-everywhere-opensource-src-5.11.3 qt5.11.3

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

sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

此处还会遇到库lib32z1 不存在的情况,百度一下添加下apt-get的source.list 就可以了

~~获取交叉编译 矫正库文件 cross-compile-tools目录在work底下
这一步是之前的版本
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~

修复软连接,此前的fixQualifiedLibraryPaths 已经不能正常使用了

wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

这一步就是为了修复 编译opengl 库链接出错的问题
如果./sysroot-relativelinks.py sysroot有提示找不到python ,那是因为有的人python 版本不一样,可以在
sudo ln -s /usr/bin/python3 /usr/bin/python 这边我的/usr/bin路径下是只有python3

否则会出现下图错误
在这里插入图片描述

步骤五:配置qt编译参数

下面对qt进行配置

cd ~/raspi/qt5.11.3/qtbase/

./configure -release -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -v -no-gbm -skip qtwayland -skip qtlocation -skip qtscript
-openg es2表示编译带opengl es2的qt
-extprefix 为输出qt库目录,这个目录迟点要复制到树莓派上
-hostprefix 为本地主机qt creator配置kit套件所需的目录,不用复制到树莓派上
-device 这里为选择的目标设备,目标设备的配置文件可在/qtbase/mkspec/device找到
-device-option CROSS_COMPILE= 这里给定我们刚刚下载的交叉编译器的路径,注意最后那里的arm-linux-gnueabihf- ,确实有一杠,不要以为打错了
-sysroot为我们刚刚构建开发板文件系统的路径

可以通过-skip参数跳过编译有问题或者很耗费时间的模块,此处我们跳过了qtwayland、qtlocation、qtscript模块 否则会出现qtwayland 编译错误 qtwayland 编译出错需要安装一堆库
https://wiki.qt.io/QtWayland/zh
在这里插入图片描述

1、64 位主机采用 -device-option CROSS_COMPILE=arm-linux-gnueabihf-,32 位主机采用 -device-option CROSS_COMPILE=arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
2、对于 5.9.1 或更高版本的 Qt,添加 -no-use-gold-linker 选项,我上面已经加了
3、这里有一个 Bug,所以需要加上 -no-gbm ,否则 Qt 编译会出错
4、不编译 qtlocation 和 qtscript 模块,这两个模块编译时也会出错
5、注意,如果不是树莓派3, 则选择对应的 device 选项: inux-rasp-pi-g++ for RPi, linux-rasp-pi2-g++ for RPi2 and linux-rasp-pi3-g++ for RPi3.
6、上面的命令中,-prefix /usr/local/qt5pi 指定了 Qt 交叉编译库存放位置,-hostprefix /usr/local/qt5pi 指定了Qt 编译的可执行工具存放的位置,比如 qmake

配置过程如果出现错误如下:
在这里插入图片描述
切换一个终端查找树莓派下的libglesv2,是有的,如下图:
在这里插入图片描述
建立一个软连接

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

切回配置qt的终端,重新执行configer,配置完成
在这里插入图片描述
出现库链接不上
http://www.voidcn.com/article/p-gmpzkvif-btn.html
https://wiki.qt.io/RaspberryPi2EGLFS
看下这2个文章理解一下,我就是在这上面跌倒好多次,才终于configer成功

步骤六:编译并安装qtbase

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

make -j4
make install

make 过程出现错误
加入configure过程中加入 -no-gbm 重新configure之后 再make就解决该问题

make install之后,我们所编译出来的库都安装在~/raspi/qt5pi目录中,现在就需要将编译输出的库同步至树莓派3中

cd ~/raspi
rsync -avz qt5pi pi@raspberrypi.local:/usr/local

步骤七:配置树莓派和qtcreate的构建套件KITS

切换到树莓派上
[树莓派] 修改树莓派的环境变量,保证qt程序执行时能够找到相应的库

官方解释:The device may have the Mesa version of libEGL and libGLESv2 in /usr/lib/arm-linux-gnueabihf, resulting Qt apps picking these instead of the real thing from /opt/vc/lib.
意思是设备在/usr/lib/arm-linux-gnueabihf可能有mesa版本的libEGL 和 libGLESv2库,但实际树莓派有原生的安装在/opt/vc/lib位置的动态库,我们需要将这个文件夹中的库链接过去。执行指令之前确保在/home/pi路径
注意,执行之前先确定下/usr/lib/arm-linux-gnueabihf/对应库的版本是不是libEGL.so.1.0.0 的版本

sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0_backup
sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0_backup
sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0
sudo ln -s /opt/vc/lib/libbrcmEGL.so /opt/vc/lib/libEGL.so
sudo ln -s /opt/vc/lib/libbrcmGLESv2.so /opt/vc/lib/libGLESv2.so

同时记得添加缺失的软连接

sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2

QtCreate 设置构建套件

1.选项-kits-编译器,添加GCC编译器对应的是 我们编译器放的位置~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
在这里插入图片描述
2.选项-kits-Qt versions 添加安装在~/raspi/qt5/bin/qmake 版本
在这里插入图片描述

  1. 选项-kits-Debuggers 添加调试器-仍在我们下载的编译器目录中
    在这里插入图片描述
    4.选项-设备-添加

在这里插入图片描述
5.选项-Kits-添加
在这里插入图片描述
至此,构建套件设置完毕,点击例程,测试看是否缺少什么库,缺少库时,需要在安装

缺少什么库就到对应的路径下 安装,并同步到树莓派

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
从github.com/raspberrypi/tools完整下载的主分支,直接git太慢还容易失败,特意分享出来,实测在Ubuntu 18上安装x64工具链可用,gcc版本:4.8.3. 文件300M+,不能上传大于220M的,尝试过解压后分卷,会导致安装有问题,所以直接发一个链接,大家去那里下吧。 文件信息: └─tools-master ├─arm-bcm2708 │ ├─arm-bcm2708-linux-gnueabi │ │ ├─arm-bcm2708-linux-gnueabi │ │ │ ├─bin │ │ │ ├─debug-root │ │ │ │ └─usr │ │ │ │ └─bin │ │ │ ├─include │ │ │ │ └─c++ │ │ │ │ └─4.7.1 │ │ │ │ ├─arm-bcm2708-linux-gnueabi │ │ │ │ │ └─bits │ │ │ │ ├─backward │ │ │ │ ├─bits │ │ │ │ ├─debug │ │ │ │ ├─decimal │ │ │ │ ├─ext │ │ │ │ │ └─pb_ds │ │ │ │ │ └─detail │ │ │ │ │ ├─binary_heap_ │ │ │ │ │ ├─binomial_heap_ │ │ │ │ │ ├─binomial_heap_base_ │ │ │ │ │ ├─bin_search_tree_ │ │ │ │ │ ├─branch_policy │ │ │ │ │ ├─cc_hash_table_map_ │ │ │ │ │ ├─eq_fn │ │ │ │ │ ├─gp_hash_table_map_ │ │ │ │ │ ├─hash_fn │ │ │ │ │ ├─left_child_next_sibling_heap_ │ │ │ │ │ ├─list_update_map_ │ │ │ │ │ ├─list_update_policy │ │ │ │ │ ├─ov_tree_map_ │ │ │ │ │ ├─pairing_heap_ │ │ │ │ │ ├─pat_trie_ │ │ │ │ │ ├─rb_tree_map_ │ │ │ │ │ ├─rc_binomial_heap_ │ │ │ │ │ ├─resize_policy │ │ │ │ │ ├─splay_tree_ │ │ │ │ │ ├─thin_heap_ │ │ │ │ │ ├─tree_policy │ │ │ │ │ ├─trie_policy │ │ │ │ │ └─unordered_iterator │ │ │ │ ├─profile │ │ │ │ │ └─impl │ │ │ │ ├─tr1 │ │ │ │ └─tr2 │ │ │ └─sysroot │ │ │ ├─etc │ │ │ ├─lib │ │ │ ├─sbin │ │ │ └─usr │ │ │ ├─bin │ │ │ ├─include │ │ │ │ ├─arpa │ │ │ │ ├─asm │ │ │ │ ├─asm-generic │ │ │ │ ├─bits │ │ │ │ ├─drm │ │ │ │ ├─gnu │ │ │ │ ├─linux │ │ │ │ │ ├─byteorder │ │ │ │ │ ├─caif │ │ │ │ │ ├─can │ │ │ │ │ ├─dvb │ │ │ │ │ ├─hdlc │ │ │ │ │ ├─isdn │ │ │ │ │ ├─mmc │ │ │ │ │ ├─netfilter │ │ │ │ │ │ └─ipset │ │ │ │ │ ├─netfilter_arp │ │ │ │ │ ├─netfilter_bridge │ │ │ │ │ ├─netfilter_ipv4 │ │ │ │ │ ├─netfilter_ipv6 │ │ │ │ │ ├─nfsd │ │ │ │ │ ├─raid │ │ │ │ │ ├─spi │ │ │ │ │ ├─sunrpc │ │ │ │ │ ├─tc_act │ │ │ │ │ ├─tc_ematch │ │ │ │ │ ├─usb │ │ │ │ │ └─wimax │ │ │ │ ├─mtd │ │ │ │ ├─net │ │ │ │ ├─netash │ │ │ │ ├─netatalk │ │ │ │ ├─netax25 │ │ │ │ ├─neteconet │ │ │ │ ├─netinet │ │ │ │ ├─netipx │ │ │ │ ├─netiucv │ │ │ │ ├─netpacket │ │ │ │ ├─netrom │ │ │ │ ├─netrose │ │ │ │ ├─nfs │ │ │ │ ├─protocols │ │ │ │ ├─rdma │ │ │ │ ├─rpc │ │ │ │ ├─rpcsvc │ │ │ │ ├─scsi │ │ │ │ │ └─fc │ │ │ │ ├─sound │ │ │ │ ├─sys │ │ │ │ ├─video │ │ │ │ └─xen │ │ │ ├─lib │ │ │ │ └─gconv │ │ │ ├─libexec │ │ │ ├─sbin │ │ │ └─share │ │ │ ├─i18n │ │ │ │ ├─charmaps │ │ │ │ └─locales │ │ │ └─locale │ │ │ ├─be │ │ │ │ └─LC_MESSAGES │ │ │ ├─bg │ │ │ │ └─LC_MESSAGES │ │ │ ├─ca │ │ │ │ └─LC_MESSAGES │ │ │ ├─cs │ │ │ │ └─LC_MESSAGES │ │ │ ├─da │ │ │ │ └─LC_MESSAGES │ │ │ ├─de │ │ │ │ └─LC_MESSAGES │ │ │ ├─el │ │ │ │ └─LC_MESSAGES │ │ │ ├─en_GB │ │ │ │ └─LC_MESSAGES │ │ │ ├─es │ │ │ │ └─LC_

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值