适用于树莓派Raspberry Pi的嵌入式QT平台(一) -- 交叉编译安装Qt Embedded 5.5
在树莓派上设计桌面应用一般情况会依赖于X11环境,如果是Windows平台,就目前而言,我们也可以选择Windows 10 IoT环境进行开发。UWP目前也支持在树莓派2上进行部署。至于常见的Linux X11或者Wayland环境,相比之下比较冗余,但是QT Emebedded直接利用Framebuffer,显示GUI,会更加轻便。利用树莓派 Open GL支持,更可以开发出3D效果,是工业领域开发设计可视化设备的不错选择,更是物联网设备一个比较好的交互方案。
1. 准备工具
我们要在Windows上对QT 5.5进行交叉编译,所以我们需要准备以下工具:
- 树莓派 1代或者2代,官方的Rasbian系统(基于Debian),目前最新版本基于Debian 8 Jessie,我们可以从官方站点下载最新版本 https://downloads.raspberrypi.org/raspbian_latest
- 下载交叉编译工具集 cross-toolchain (http://gnutoolchains.com/raspberry/) 。如果你是基于Jessie的Rasbian,选择 raspberry-gcc-4.9.2-r2.exe。 如果是Wheezy,你需要选择 raspberry-gcc4.6.3.exe。安装toolchain.
- 下载MinGW toolchain (http://gnutoolchains.com/mingw32)并安装,我们需要在Windows中编译QMake
- 下载安装Python 2.7 for Windows (https://www.python.org/ftp/python/2.7.11/python-2.7.11.msi) 并且确保Python执行路径写入了系统环境变量PATH
- 下载QT 5.5 源代码,http://download.qt.io/archive/qt/5.5/5.5.0/single/
2. 安装Rasbian
大家可以参考这个链接 https://www.raspberrypi.org/documentation/installation/installing-images/windows.md 来安装Rasbian,不过简单来讲,在Windows下安装Rasbian只需要用WinfFlashTool 或者 Win32DiskImager 将系统镜像刷入一张不小于8GB的SD
- WinFLASHTool: http://winflashtool.sysprogs.com/
- Win32DiskImager: https://sourceforge.net/projects/win32diskimager/
将SD插入树莓派,接上电源和HDMI,启动系统,默认用户pi,密码raspberry登入系统 (建议打开Raspi-config配置系统默认进入CLI,修改管理员密码,配置GPU内存128MB,然后重启)。
运行命令进行系统更新。
sudo apt-get update
sudo apt-get upgrade
建议:先预先安装下面库,交叉编译Qt,xcb依赖这些库,默认Raspbian中可能不带
sudo apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev
你可能会碰到某些库无法下载,你可以手动下载然后通过 dpkg -i 来安装。
3. 同步Linux环境
在Windows中交叉编译Qt,需要先同步树莓派Linux 库、头文件到sysroot下。在<sysgcc>\Raspberry\TOOLS中打开 UpdateSysroot.bat (<sysgcc>为toochain的安装目录,例如C:\SysGCC)
在Targeted Linux machine输入选择你的树莓派,如上图输入你需要同步的目录,建议同步/opt目录 (在输入框里按 Ctl+Enter换行,直接按Enter默认为开始同步,请注意),里面包含了OpenGL的头文件,我们在编译Qt需要引用。 注意,千万不要同步/etc目录,因为他会复写本地的/etc/ld.so.conf文件,会破化Windows下编译时的头文件引用。如果不小心同步了,我们需要重新安装 aspberry-gcc4.6.3.exe 来提取恢复此文件。
4. 配置编译qmake
我们需要先解压缩下载下来的qt源码包,比如解压缩在C:\qt-everywhere-opensource-src-5.5.0 (可以用7-zip来解压缩)。或者打开MinGW32下的msys (<sysgcc>\MinGW32\msys\1.0\msys.bat) 进入你的qt代码下载目录(例如 C:\download)
然后确认代码全部解压缩到当前目录下,确认gcc和arm-linux-gnueabihf-gcc工具的路径
如果没有找到gcc和arm-linux-gnueabihf-gcc,你可以设置你的Windows系统PATH环境变量,加入 c:\SysGCC\Raspberry\bin和c:\SysGCC\MinGW32\bin
打开 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\linux-arm-gnueabi-g++下的qmake.conf文件,将所有的arm-linux-gnueabi-替换成arm-linux-gnueabihf-,如下图:
好了,现在我们可以开始编译Qt。由于Qmake编译脚本的一个bug,我们无法直接交叉编译Raspberry版本,需要分为两步,先编译Windows Qmake然后再交叉编译Raspberry Qt。
打开 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\win32-g++ 下的qmake.conf文件,在 CXXFLAGS 后面添加 -U__STRICT_ANSI__ 标记
输入下面的命令开始编译Qmake for Windows
cd /c/download
mkdir qt-build
cd qt-build
../qt-everywhere-opensource-src-5.5.0/configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi2-g++ -sysroot C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5
选择 'o' Open Source和yes同意GPLV2&3许可证
-opengl es2参数:配置Qt直接使用Raspberry framebuffer 而不是X11
全部配置完成后,你可以用命令 qtbase/bin/qmake -v 检查下qmake是否配置成功
5. 交叉编译Qt for Raspberry
现在我们打开 C:\download\qt-everywhere-opensource-src-5.5.0\qtbase\configure 文件,找到3900行左右 "Creating qmake...",修改为:
if [ '!' -f "$outpath/bin/qmake.exe" ]; then
注意qmake.exe后面的.exe扩展名和最后的then。使用已经编译好的Windows qmake而不用再去生成qmake
好了,到此我们做好了所有的准备工作,就要开始编译Qt for Raspberry Pi了。在这之前,建议大家再次确认下是否有遗漏或者错误,不然一次编译就需要十几个小时,中断后再来很费时间。
回到msys窗口,进入qt-build目录,输入下面的命令开始配置:
../qt-everywhere-opensource-src-5.5.0/configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi2-g++ -sysroot C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5 -device-option CROSS_COMPILE=C:/SysGCC/Raspberry/bin/arm-linux-gnueabihf- -qt-xcb
同样输入 "o" 和 "yes" 使用开源版本和同意许可证内容。
可以忽略出现的警告。但如果出现缺少库依赖的错误,请回到第3步,同步Linux环境,检查是否已经同步了必要的目录。检查是否在Raspbian中遗漏了必须的库。可以按照输出提示,去检查Qt环境的依赖库,并且在Raspbian中手动安装,然后再进行一次同步。
你也可以检查 <sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot\etc\ld.so.conf文件,是否包含了下面配置
/opt/vc/lib
/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/libfakeroot
/usr/local/lib
如果你看到了下面的内容,那么你就可以输入 make && make install 开始编译安装。不出意外,整个过程打开需要15小时左右,具体视机器性能,反正我花了20小时完成所有编译安装。默认会安装到 <sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5 目录。
6. 同步Qt到Raspbian并测试
等待一天后,编译安装完成,我们就可以将安装在本地PC上的Qt复制到Raspberry中。不建议使用SFTP工具进行上传,因为SFTP上传无法将文件属性复制过去。这里建议使用 toolchain 中自带的SmarTYY来完成上传。打开 <sysgcc>\Raspberry\TOOLS\PortableSmartty下的 SmarTTY.exe 工具,配置连接到你的树莓派。
cd/usr/local
sudomkdirqt5sudo chown pi qt5
创建Qt 5的安装目录,然后打开SmarTYY菜单,选择上传目录。
配置本地目录为 <sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5, 远程目录为 /usr/local/qt5,开始上传
完成后,我们就可以在SSH中进行测试,进入 /usr/local/qt5/examples/widgets/richtext/textedit 运行例子 ./textedit。这时如果你的树莓派连接着显示器,你就会看到一个文本编辑器显示出来,接上鼠标键盘,你就可以进行图形化界面操作了。
SSH端:
树莓派连接的显示器:
下一篇:适用于树莓派Raspberry Pi的嵌入式QT平台(二) -- 在Windows下用Qt Creator开发编译Raspberry Qt 5应用程序
大部分内容参考自:http://visualgdb.com/tutorials/raspberry/qt/embedded/