如何从 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
特别注意需要以下参数:
-xplatform linux-arm-gnueabi-g++ 这是mkspec。如果未编辑 linux-arm-gnueabi-g++,但创建了新的 mkspec,则相应地更改名称。
-device-option CROSS_COMPILE=/arm-linux-gnueabihf- 不确定,如果这是必要的。在一些教程中找到它。没有这个选项一切正常。调整 以像在 mkspec 中一样交叉编译器。
-sysroot /home/me/rasp 非常重要。 Raspberry Pi挂载的挂载点。
-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。
网上有一些教程,解释了如何为 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
特别注意需要以下参数:
-xplatform linux-arm-gnueabi-g++ 这是mkspec。如果未编辑 linux-arm-gnueabi-g++,但创建了新的 mkspec,则相应地更改名称。
-device-option CROSS_COMPILE=
/arm-linux-gnueabihf- 不确定,如果这是必要的。在一些教程中找到它。没有这个选项一切正常。调整 以像在 mkspec 中一样交叉编译器。 -sysroot /home/me/rasp 非常重要。 Raspberry Pi挂载的挂载点。
-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。