概述信息

最近因为一个项目的原因,接触树莓派,觉得有意思,买了一个板子来自己玩,同时最近在了解QT开发,所以,就趁此机会尝试编写可以在树莓派上运行的程序。

环境准备

树莓派

我选择了树莓派3B+,这块板子的性能更高,因此可玩性可能更好一些,购买可以选择去马云家,搜索下有很多,具体的配置如下:

交叉编译主机

Mac: 本来准备在Mac上交叉编译,并搭建相关开发环境,在参考qt-rpi-macos的指导编译后,在Mac上编译的程序没有EGL,配置起来很复杂,所以选择放弃。
Ubuntu 18.04: 后来又跟着Cross-compile and deploy Qt 5.12 for Raspberry Pi这篇指导进行Qt编译和开发环境搭建,Cross-compile and deploy Qt 5.12 for Raspberry Pi的指导是在OpenSUSE 上进行的,我对Ubuntu比较熟悉,所以我选择了Ubuntu。

Qt版本

Cross-compile and deploy Qt 5.12 for Raspberry Pi的中使用了Qt 5.12.0版本,但我在编译的过程中,使用Qt 5.12.0编译有问题,所以选择了5.11.2。

总结一下环境:

  • 树莓派3B+
  • Ubuntu 18.04
  • Qt 5.11.2

编译Qt

树莓派端的工作

树莓派基础环境准备

第一步是安装树莓派,这个教程度娘家一堆,这里不重复,自行百度。

第二步是更新树莓派,以保证有最新的库,这步很重要,必须这样做,否则没有最新的库和包含文件,是没办法进行后边的操作的。

1
2
sudo rpi-update
reboot

同时,在树莓派上配置打开VNC和SSH,可以选择用树莓派的图形界面或者是使用

1
sudo raspi-config

为树莓派安装开发库

为了编译Qt,我们需要安装一些必须的库文件,因为需要安装一些源文件包,因此,需要将 deb-src 的这个源启用,具体的启用方法是修改 /etc/apt/sources.list

1
sudo nano /etc/apt/sources.list

效果如下图,要把 deb-src前面的 “#”去掉,保存后执行以下命令。

1
2
3
4
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编译后的目标文件夹

在树莓派端创建如下文件夹和修改相应的权限,现在只是创建文件夹,还什么都不需要做。

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

主机端的工作

准备工作目录和工具链

要创建一个文件夹,可下载一个工具链,如果提示git没有安装,用sudo apt-get install git安装一下就可以。

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

创建和配置sysroot

这个sysroot文件夹非常重要,我们要用这个文件夹把编译QT,以及后期开发所需的库同步过来,先在主机创建下面的文件夹

1
mkdir sysroot sysroot/usr sysroot/opt

然后我们需要同步树莓派中的库文件和包含文件,我们使用rsync命令

1
2
3
4
rsync -avz pi@raspberrypi_ip:/lib sysroot
rsync -avz pi@raspberrypi_ip:/usr/include sysroot/usr
rsync -avz pi@raspberrypi_ip:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi_ip:/opt/vc sysroot/opt

raspberrypi_ip是你的树莓派的IP地址。
同步完的效果是这样的:

接下来,调整一下符号链接,因为目录下的文件是从树莓派同步过来的,链接部分都是失效的,需要重新链接

1
2
3
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

下载Qt

在我参考的指南中,作者使用的是5.12.0版本的QT,我尝试过,并没有成功。所以我尝试换了一个版本5.11.2就成功了,所以我推荐你参考我的指南来走

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

到这里,编译前的准备工作都已经做完了了,接下来就是进入到编译的过程了。

为Qt交叉编译进行配置

因为在Raspbian stretch版本中,使用了EGL,不过呢,使用了一个别的名字brcmEGL,具体方法如下:
编辑./qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf中的-lEGL修改为-lbrcmEGL,以及修改-lGLESv2-lbrcmGLESv2,保存之后,使用下面的命令进行配置。

1
./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 -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

编译和安装Qt

Configure运行完,如果你看到下面的提示,则表示环境配置没有任何问题,可以进行编译和安装了。

Qt is now configured for building. Just run ‘make’.
Once everything is built, you must run ‘make install’.
Qt will be installed into ‘/home/penn/raspi/qt5pi’.

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

编译和安装需要多久是根据你电脑的性能的,我是用下面的命令来编译的,大概编译了2~3个小时。

1
2
make -j4
make install

make install后,实际上qt是安装在本地的qt5pi目录的,需要将这个目录上传到树莓派,还是使用rsync命令

1
rsync -avz qt5pi pi@raspberrypi_ip:/usr/local

如果你顺利执行到了这一步,表示你的Qt已经编译安装成功,接下来可以进行开发环境的搭建了。

搭建开发环境

开发环境创建和配置其实就两件事情,第一是连上你的树莓派,第二是配置之前编译出来的Qt的环境来编译程序

创建远程设备

在QtCreator的 工具->选项 下选中 设备,添加一个新的通用Linux设备进行配置,具体见下图
在设备的域名或者IP地址中填入树莓派的IP,用户名为pi,密码填写树莓派的密码。

注意: 这个是用ssh进行远程访问的,要确保树莓派的ssh是打开的。

配置完成应该能够看到如下的画面:

配置编译器和Qt版本

为了让我们开发的程序能够在树莓派上运行,我们需要使用适合树莓派的交叉编译器,在QtCreator中,我们要用到编译Qt的编译器,具体方法如下:
在QtCreator的 工具->选项 下选中 构建和运行

添加gcc编译器,编译器的路径为

1
~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc

添加一个G++编译器,编译器路径为

1
~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++

设置GDB

切换到 Debuggers添加Debugger,这里要注意,我使用~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gdb时,会报错,无法使用,因此我使用了gdb-multiarch

1
sudo apt-get install gdb-multiarch

之后再Debuggers中添加一个gdb-multiarch,路径为

1
/usr/bin/gdb-multiarch

设置qmake

切换到QtVersions页面,添加一个新的Qt版本,选择刚编译出来的qmake即可,路径为

1
~/raspi/qt5/bin/qmake

设置kit

构建套件(Kits)页面,添加一个新的Kit,设置如图上的那些信息,在完成这一步后,QtCreator的编译环境也设置好了,可以开始编程了。

开始开发

在QtCreator中创建一个Qt Widgets Application程序来测试我们的环境到底有没有设置好。

设置上传路径

我使用的QtCreator版本(4.5.2)创建出来的项目.pro文件,只有默认的部署路径/opt/,pi用户在树莓派上没有这个目录的写入权限,所以我们要改目录,在.pro文件中加入如下代码

1
target.path = /home/pi/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

然后编译执行,出现下面的信息,表示程序上传成功
Starting /home/pi/WidgetTest/bin/WidgetTest…

Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).

用VNC登录到树莓派,可以看到我们的程序是上传成功的,运行也可以看到Qt的图形界面。

链接库文件

有时我们的程序需要用到树莓派使用的一些库文件比如wiringPi,在我们需要的使用,在.pro文件中加入如下的代码就可以了

1
LIBS += -L/usr/lib -lwiringPi

到这一步呢,表示我们已经成功的搭建了树莓派在Ubuntu 18.10中的QtCreator的Qt开发环境了,可以进行图形界面的开发了。