如何从 git 存储库为 Raspberry Pi 编译 Qt5 开发分支?

How do I compile Qt5 dev branch from git repository for the Raspberry Pi?

网上有一些教程,解释了如何为 Raspberry Pi 编译 Qt5。不幸的是,它们都有点过时了。对于某些 GLIBC 函数,通常会得到 'undefined references'。 这个问答解释了如何创建一个最新的(2015 年 3 月)gcc 交叉编译器:

这个问答解释了要准备 Raspbian 本身以供此编译器使用必须做什么:

但是Qt5本身是如何编译的呢?

要为 Raspberry Pi 创建 Qt5,需要几个步骤:

从 git 获取 Qt5 源代码。要结帐 Qt5:

git clone http://code.qt.io/cgit/qt/qt5.git

git clone http://code.qt.io/qt/qt5.git

存储库可能会不时更改。 qt 项目仍在发展中。

以上命令在 Linux 主机上完成。将 dev 分支 cd 到 qt5 并且:

git checkout dev

接着是

./initRepository

这需要相当长的时间。此时可以挂载 Raspberry Pi 根文件夹。可以使用卡 reader 并安装 SD 卡。一个更好的解决方案是使用 nfs、samba、sshfs 来挂载生命 Raspberry Pi。这种方式的小错误,例如缺少开发包,很容易修复 'on the fly'.

我使用 sshfs:

sshfs pi@raspberrypi:/ /home/me/rasp

如果此挂载成功,Raspberry Pi 的根文件系统可在 /home/me/rasp 下访问。

签出 Qt5 后,必须进行以下更改: 在 qt5/qtbase/mkspecs 中,文件 linux-arm-gnueabi-g++ 必须被编辑(或复制和编辑)

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental

QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC                = <path to>/arm-linux-gnueabihf-gcc
QMAKE_CXX               = <path to>/arm-linux-gnueabihf-g++
QMAKE_LINK              = <path to>/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = <path to>/arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = <path to>/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = <path to>/arm-linux-gnueabihf-objcopy
QMAKE_NM                = <path to>/arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = <path to>/arm-linux-gnueabihf-strip


QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include/EGL/
QMAKE_INCDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/include/GLES2/
QMAKE_INCDIR_OPENVG     = $$[QT_SYSROOT]/opt/vc/include/VG/  

QMAKE_LIBDIR_EGL        = $$[QT_SYSROOT]/opt/vc/lib/
QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib/
QMAKE_LIBDIR_OPENVG     = $$[QT_SYSROOT]/opt/vc/lib/

QMAKE_LIBS_EGL          = -lEGL -lGLESv2                       
QMAKE_LIBS_OPENVG       = -lOpenVG -lEGL -lGLESv2         
QMAKE_LIBS_OPENGL_ES2   = -lEGL -lGLESv2

LIBS  += -L$$[QT_SYSROOT]/opt/vc/lib -lvcos -lbcm_host -lvchiq_arm 
LIBS  += -lEGL -lGLESv2 

INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include 
INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include/interface/vcos 

INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads 
INCLUDEPATH  += $$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux

必须替换为交叉编译器,它是根据以下内容创建的:

下一步是配置 Qt5:

   ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=<path to>/arm-linux-gnueabihf- -xplatform linux-arm-gnueabi-g++ -sysroot /home/me/rasp -opensource -confirm-license -optimized-qmake  -release -make libs -prefix /usr/local/qt5pi -v -libinput -linuxfb -directfb -xcb  -fontconfig -ts
   lib -evdev -iconv -xinput2 -xkbcommon-evdev -eglfs -icu -qt-pcre -lpthread  -system-sqlite -no-sql-sqlite2 -gstreamer 1.0 -reduce-exports

特别注意需要以下参数:

  1. -xplatform linux-arm-gnueabi-g++ 这是mkspec。如果未编辑 linux-arm-gnueabi-g++,但创建了新的 mkspec,则相应地更改名称。

  2. -device-option CROSS_COMPILE=/arm-linux-gnueabihf- 不确定,如果这是必要的。在一些教程中找到它。没有这个选项一切正常。调整 以像在 mkspec 中一样交叉编译器。

  3. -sysroot /home/me/rasp 非常重要。 Raspberry Pi挂载的挂载点。

  4. -prefix /usr/local/qt5pi 树莓派上要安装Qt5的地方

现在要做的就是往常一样: make/make 安装。该命令构建 Qt5 并将其安装在 Raspberry Pi 上的 /usr/qt5pi 中。确保此位置存在适当的写入权限。

还有一件事:

qtwayland/src/hardwareintegration/client/brcm-egl/qwaylandbrcmeglintegration.h

在我编译我的 qt5 时包含一个错误。 快速修复是编辑此文件:

#include <QtWaylandClient/private/qwaylandclientbufferintegration_p.h>

#include <wayland-client.h> <--- add this below the #include above.

最后一件事:这个 qt5 适合在 Raspberry Pi 内部使用。创建程序时,RPi 必须 挂载并且编译必须 在同一主机下使用与 Qt5 相同的交叉编译器完成编译。

最后一件事:RPi 不支持 xcb。所以 X11 转发是不可能的。

编辑: 有人告诉我这不是真的。不,不是。然而,事实是,RPi 不支持 xcb/X11 用于使用 OpenGL 的程序。所以没有 qtquick 2 程序:http://lists.qt-project.org/pipermail/qtonpi/2012-October/001087.html

目前对此无能为力,它的图形驱动程序根本不支持它。 Wayland 支持有限。最好使用的平台是eglfs。