做这件事的原因有两个:
第一是,接上一篇《为树莓派3B+编译Qt 5.11.2》中的Ubuntu 18.10是在虚拟机中搭建的,所以每次要进行开发时,都需要再启动一个虚拟机,有点麻烦,不想这样做,也就是懒;
第二是,Mac是Unix-like系统,理论上只要找到合适的编译器,也就可以在Mac上配置环境而使用在虚拟机中编译的Qt。
所以带着勇闯雷区的勇气就开始了我的尝试之旅了。

树莓派部分

树莓派部分我们已经在Ubuntu中做好了一切准备,所以我们不需要再做什么了,具体参考为树莓派3B+编译Qt 5.11.2


主机准备

我的电脑的信息如下:

工作目录和工具链准备

这部分的工作呢,和在Ubuntu上准备是一样的,具体如下:

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

虽然我们不用tool下的gcc编译器,但我不确定是否用到其他环境,所以我们还是完整的下载。

准备正确的工具链和sysroot

下载Mac下用的工具链

armv8-rpi3-linux-gnueabihf-gcc-8.1.0-macos-high-sierra这个工具链是在mac下可以使用来编译Qt的交叉编译器,先git clone下这个工具链。

1
git clone git@github.com:yc2986/armv8-rpi3-linux-gnueabihf-gcc-8.1.0-macos-high-sierra.git

下载完工具链后,把armv8-rpi3-linux-gnueabihf拷贝到~/raspi/tools目录下。

准备sysroot

还是需要在raspi下创建sysroot,并同步树莓派上面的库

1
2
3
4
5
mkdir sysroot sysroot/usr sysroot/opt
rsync -avz -e "ssh -p 22" pi@raspberrypi.local:/lib sysroot
rsync -avz -e "ssh -p 22" pi@raspberrypi.local:/usr/include sysroot/usr
rsync -avz -e "ssh -p 22" pi@raspberrypi.local:/usr/lib sysroot/usr
rsync -avz -e "ssh -p 22" pi@raspberrypi.local:/opt/vc sysroot/opt

raspberrypi.local换成树莓派的IP。
还有一种办法就是直接同步Ubuntu 下配置好的sysroot,具体方法如下:

1
rsync -avz -e "ssh -p 22" penn@Penn 92.168.3.113:/home/penn/raspi/sysroot ./

这条命令是把Ubuntu端的sysroot同步到Mac的raspi目录。

还有一步非常非常重要的步骤,不然编译器的环境不完整,需要将~/raspi/tools/armv8-rpi3-linux-gnueabihf/armv8-rpi3-linux-gnueabihf/sysroot下所有的目录及文件拷到~/raspi/sysroot下,选择合并处理

编译Qmake

下载源代码

1
2
3
wget http://download.qt.io/official_releases/qt/5.11/5.11.2/single/qt-everywhere-src-5.11.2.tar.xz
tar xvf qt-everywhere-src-5.11.2.tar.xz
cd qt-everywhere-src-5.11.2

做完前面的工作,mac端的编译环境就准备好了,我们需要用到qt的编译器qmake,这个需要我们自己编译出来,步骤不重复叙述,configure要说一下。

1
./configure -release -no-opengl -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=~/raspi/tools/armv8-rpi3-linux-gnueabihf/bin/armv8-rpi3-linux-gnueabihf- -sysroot ~/raspi/sysroot/ -opensource -confirm-license -skip qtwayland -skip qtlocation -skip qtscript -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -v -no-gbm

这里注意,我们用了-no-opengl选项,因为我们在Ubuntu上已经编译了,而且这里我们也只是需要生成一个qmake及相关环境,我们并不用mac下编译出来的库。

1
2
make -j4
make install

做完上面的步骤后,执行下面的命令确认是否正确编译了qmake

1
2
cd ~/rasp/qt5
./bin/qmake -v

如果正确编译了qmake,能够得到下面的信息

QMake version 3.1

配置开发环境

QtCreator的配置是跟Ubuntu下是一样的,参考为树莓派3B-编译Qt-5-11-2/#搭建开发环境

GDB

要特别说明一下,这里的GDB有点区别,GDB设置的路径为

1
/usr/local/Cellar/gdb/8.2.1/bin/gdb

测试环境是否可用

创建一个Qt Widgets Application名字为WidgetsDemo,然后编译执行,在VNC到树莓派,可以看到我们的程序已经上传到输煤派了。

好了,到这里在macOS mojave下搭建Qt的交叉编译环境也就完成了,希望你也能成功。