配置树莓派与win7的 QT交叉编译环境

花了一个星期,搭建起来的树莓派的嵌入式QT。

原因:
1.树莓派上本身是自带QT的,可是在树莓派上编译的QT的程序,是需要树莓派上自带的图像系统服务,也就是X—service,在字符串界面你是无法打开你在图形界面时编译的QT的程序,会显示需要x-service,而且树莓派开机显示图像界面时候,需要占用很长的时间,所以想设置一个在文本界面中就可以显示QT界面的,可以自己做出你的树莓派(类似ARM开发板的上的QT界面那种)。
2.在树莓派上使用Qt creator 会比在windows上运行的慢,不利于开发,搭建好后的环境,你可以直接在WIN7操作操作你的QT程序运行在树莓派上(美滋滋的)

首先参考网上的例子
https://www.jerryzone.cn/qt-embeded-raspberrypi/
http://www.cnblogs.com/wpf_gd/articles/5233204.html (使用这个)

第一:使用的树莓派系统镜像为2016-02-26-raspbian-jessie.img,旧版本中比较稳定的版本,由于现在树莓派已经是pi3,系统版本是pi2,pi2上没有蓝牙以及无线网卡(详细的版本区别,自行百度)

第二:在选择Qt版本的时,QT的版本中有的会有相关连的linux设备
例如LZ的:
C:\download\qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\devices
LZ使用的是树莓派开发3B+的,系统镜像烧录的是PI2的,亲测没有问题
配置树莓派与win7的 QT交叉编译环境_第1张图片

在QT 5.8的版本中有树莓派pi3的g++可以生成在PC机上的qmake文件,qmake文件相当于是QT编译器中的 QT VERSION 版本相关的配置文件。

第一步: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.
配置树莓派与win7的 QT交叉编译环境_第2张图片

下载MinGW toolchain (http://gnutoolchains.com/mingw32)并安装,我们需要在Windows中编译QMake
配置树莓派与win7的 QT交叉编译环境_第3张图片

下载安装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/

配置树莓派与win7的 QT交叉编译环境_第4张图片

将SD插入树莓派,接上电源和HDMI,启动系统,默认用户pi,密码raspberry登入系统 (建议打开Raspi-config配置系统默认进入CLI,修改管理员密码,配置GPU内存128MB,然后重启)。
运行命令进行系统更新。
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

有些库无法安装的时候, apt-get update 一下,再试一下

3.同步Linux环境
在Windows中交叉编译Qt,需要先同步树莓派Linux 库、头文件到sysroot下。在\Raspberry\TOOLS中打开 UpdateSysroot.bat (为toochain的安装目录,例如C:\SysGCC)

配置树莓派与win7的 QT交叉编译环境_第5张图片

在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 (\MinGW32\msys\1.0\msys.bat) 进入你的qt代码下载目录(例如 C:\download)

配置树莓派与win7的 QT交叉编译环境_第6张图片

注意:你电脑上安装的Qt版本需要和你下载的qt源代码一样,不然你的qmake.exe是无法使用的

然后确认代码全部解压缩到当前目录下,确认gcc和arm-linux-gnueabihf-gcc工具的路径

配置树莓派与win7的 QT交叉编译环境_第7张图片

如果没有找到gcc和arm-linux-gnueabihf-gcc,你可以设置你的Windows系统PATH环境变量,加入 c:\SysGCC\Raspberry\bin和c:\SysGCC\MinGW32\bin

配置树莓派与win7的 QT交叉编译环境_第8张图片

打开
qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\linux-arm-gnueabi-g++下的qmake.conf文件,将所有的arm-linux-gnueabi-替换成arm-linux-gnueabihf-
如下图:

配置树莓派与win7的 QT交叉编译环境_第9张图片

好了,现在我们可以开始编译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__ 标记

配置树莓派与win7的 QT交叉编译环境_第10张图片

输入下面的命令开始编译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

配置树莓派与win7的 QT交叉编译环境_第11张图片

选择 ‘o’ Open Source和yes同意GPLV2&3许可证
-opengl es2参数:配置Qt直接使用Raspberry framebuffer 而不是X11
全部配置完成后,你可以用命令 qtbase/bin/qmake -v 检查下qmake是否配置成功

配置树莓派与win7的 QT交叉编译环境_第12张图片

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

配置树莓派与win7的 QT交叉编译环境_第13张图片

好了,到此我们做好了所有的准备工作,就要开始编译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

配置树莓派与win7的 QT交叉编译环境_第14张图片

同样输入 “o” 和 “yes” 使用开源版本和同意许可证内容。
可以忽略出现的警告。但如果出现缺少库依赖的错误,请回到第3步,同步Linux环境,检查是否已经同步了必要的目录。检查是否在Raspbian中遗漏了必须的库。可以按照输出提示,去检查Qt环境的依赖库,并且在Raspbian中手动安装,然后再进行一次同步。
你也可以检查 \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小时完成所有编译安装。默认会安装到 \Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5 目录。

配置树莓派与win7的 QT交叉编译环境_第15张图片

第6步:同步Qt到Raspbian并测试
等待一天后,编译安装完成,我们就可以将安装在本地PC上的Qt复制到Raspberry中。不建议使用SFTP工具进行上传,因为SFTP上传无法将文件属性复制过去。这里建议使用 toolchain 中自带的SmarTYY来完成上传。打开 \Raspberry\TOOLS\PortableSmartty下的 SmarTTY.exe 工具,配置连接到你的树莓派。
cd/usr/local
sudomkdirqt5
sudo chown pi qt5
创建Qt 5的安装目录,然后打开SmarTYY菜单,选择上传目录。

配置树莓派与win7的 QT交叉编译环境_第16张图片

配置本地目录为 \Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5, 远程目录为 /usr/local/qt5,开始上传

配置树莓派与win7的 QT交叉编译环境_第17张图片

完成后,我们就可以在SSH中进行测试,进入 /usr/local/qt5/examples/widgets/richtext/textedit 运行例子 ./textedit。这时如果你的树莓派连接着显示器,你就会看到一个文本编辑器显示出来,接上鼠标键盘,你就可以进行图形化界面操作了。
SSH端:

配置树莓派与win7的 QT交叉编译环境_第18张图片

注意:在这一步中,有的运气好可以通过TTY上传上去,然而LZ的并没有上传成功。
然后LZ在树莓派上下载了一个qt,因为下载这个qt会自动安装qt在树莓派上的相关的一些服务
首先LZ需要的开发工具Qt Creator 先从终端单独下载:
sudo apt-get install qt4-dev-tools
之后安装QT CREATOR 编译器:
sudo apt-get install qtcreator
之后继续安装编译环境:
sudo apt-get install gcc
sudo apt-get install xterm
sudo apt-get install git-core
sudo apt-get install subversion
(注意这里树莓派上的QT,我们并没有使用到,只是通过TTY上传没有成功,需要根据树莓派本事自带的QT一些依赖库等,使我们的QT5在移植的时候,不会报错误)

C:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5
然后把你之前在pc上交叉编译树莓派的Qt5文件夹通过SSH直接移动到树莓派/usr/local/上

在WINDOW下安装QT

1.准备工作
Qt Creator for Windows:http://download.qt.io/official_releases/qtcreator/3.6/3.6.0/qt-creator-opensource-windows-x86-3.6.0.exe
或者我们也可以下载安装 Qt 5.5.1 for Windows 32-bit (MinGW 4.9.2):http://download.qt.io/official_releases/qt/5.5/5.5.1/qt-opensource-windows-x86-mingw492-5.5.1.exe
里面已经带了Qt Creator
当然,我们也可以选择Qt for Windows (VS编译版本)
安装Qt for Windows,我们可以注册一个Qt账号,然后选择安装目录并继续。

配置树莓派与win7的 QT交叉编译环境_第19张图片

2.配置编译环境
安装完成后,打开Qt Creator。在Creator中的项目,类似于 Xcode,我们需要配置好多种目标环境,不同的项目需要配置指定目标环境,就可以针对目标编译生成。
打开Tools -> Options…

配置树莓派与win7的 QT交叉编译环境_第20张图片

选择Devices,点击Add..增加一个Generic Linux Device,然后Start Wizard,填入设备名字,网络地址以及用户名密码等。

配置树莓派与win7的 QT交叉编译环境_第21张图片

完成后,会自动开始测试设备连接。

配置树莓派与win7的 QT交叉编译环境_第22张图片

然后我们可以开始配置Build & Run,选择Qt Versions,添加一个Qt Version,选择我们之前编译好的Windows下的qmake:

配置树莓派与win7的 QT交叉编译环境_第23张图片

然后添加一个Compiler,选择Compilers选项卡,Add.. 一个MinGW类型的编译器,选择\Raspberry\bin\arm-linux-gnueabihf-g++.exe

配置树莓派与win7的 QT交叉编译环境_第24张图片

添加一个CMake,\Raspberry\bin\make.exe

配置树莓派与win7的 QT交叉编译环境_第25张图片

好了,最后我们就需要配置出一个Kit,包含一个目标环境所需要的qmake,设备,CMake,以及配置文件。点击Kits选项卡:

配置树莓派与win7的 QT交叉编译环境_第26张图片

Device type:Generic Linux Device
Device:选择你刚才新建的设备
Sysroot:\Raspberry\arm-linux-gnueabihf\sysroot
Compiler:选择新建的编译器
Qt version:选择Raspberry Pi的Qt
Qt mkspec:\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5\mkspecs\devices\linux-rasp-pi2-g++
CMake Tool:选择新建的CMake
保存新的Kit配置。
因为Qt Creator的Debugger GDB需要有Python支持,但是MinGW中提供的GDB均没有支持Python,所以我们目前无法指定Debugger,需要之后交叉编译一个Raspebrry Pi支持的GDB with Python才可以作为Debugger来调试。

3.新建Qt for Raspberry Pi项目并编译测试
点击 File -> New File or Project,打开新建项目向导,选择Qt Widgets项目模板,填入项目名称,务必在Kit Selection中选择才新建的Kit环境。

配置树莓派与win7的 QT交叉编译环境_第27张图片

配置树莓派与win7的 QT交叉编译环境_第28张图片

完成代码后,我们可以通过左下侧的编译运行按钮直接编译输出到Raspberry Pi

这里写图片描述

目前我们只能使用这里写图片描述Run,还无法使用调试器。我们可以打开Qt Examples中的项目来进行测试。

在window上的qt上构建项目后,将Qt生成的可执行的文件,传入到树莓派中,修改其中的执行权限,就可以在树莓派上运行了
Chmod +x filename

后续在pc上编译时候

1.中文字体
树莓派中的Qt 默认是没有中文字体的,所以所有在Qt Creator中设置的中文到了树莓派上都是空白。解决方案很简单,就是把你需要显示的字体从电脑的C:\Windows\Fonts文件夹中拷出来,上传到树莓派的/usr/local/qt5/lib/fonts目录中,然后重启Qt 程序即可。常用的字体有SimSum、微软雅黑、宋体这些,全部考进去就行了,然后在你的树莓派上
sudo nano /etc/profile加入你QT运行时需要加载库的位子

export QT_QPA_FONTDIR=/usr/local/qt5/lib/fonts
export QT_QWS_FONTDIR=/usr/local/qt5/lib/fonts 

注意qt4以后fonts里面是没有配置文件fontdir的,只要在fonts里放好了字体文件,运行qt时就可以找到了,但是有一个问题需要注意,在运行qt程序中,如果在你的fonts里面有太多的字体文件,会出现中文不显示的问题,不是乱码,就是什么都没有的空白格子,可能是由于他在fonts文件夹里找了最佳字体的时候找了个不支持中文的只要把不用的字体全部删掉,留下你需要用的就可以了。

2.编写好Qt程序点击运行后提示Command Not Found
这是因为对于Qt 来说并不知道应该把程序部署到树莓派上的哪个目录中来运行,所以会提示找不到命令来执行。解决方案就是在工程的.pro文件中添加以下内容:

target.path=部署目录,譬如/home/pi/inject
INSTALLS+=target

3.编写好的Qt程序在测试的时候不能显示在FrameBuffer上
这是因为Qt Creator在部署完成后执行程序时并不会添加上QT_QPA_PLATFORM变量,所以我们需要将这个变量添加至系统变量,在/etc/profile中添加此变量:

export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb*

你可能感兴趣的:(树莓派,qt,交叉编译环境配置)