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

时间:2015-05-11 08:32:15

标签: qt raspberry-pi cross-platform qt5 raspbian

网上有一些教程,解释了如何为Raspberry Pi编译Qt5。不幸的是,他们都有点过时了。通常会为某些GLIBC函数获取“未定义的引用”。 这个问题和答案解释了如何创建一个最新的(2015年3月)gcc交叉编译器: How can I create a modern cross compile toolchain for the Raspberry Pi 1?

这个问题和答案解释了为编写Raspbian本身需要做些什么才能被这个编译器使用: How do I prepare a Raspberry Pi with Raspbian so I can cross compile Qt5 programs from a Linux host?

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

1 个答案:

答案 0 :(得分:1)

要为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根文件夹。可以使用读卡器并安装SD卡。一个更好的解决方案是使用nfs,samba,sshfs来安装生命Raspberry Pi。这样小错误,例如缺少开发包,可以轻松修复'即时#。

我使用sshfs:

  

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

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

签出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

&lt;&gt;路径必须用交叉编译器替换,交叉编译器是根据:How can I create a modern cross compile toolchain for the Raspberry Pi 1?

创建的

下一步是配置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 =&lt; path to&gt; / arm-linux-gnueabihf-不确定,如果有必要的话。在一些教程中找到它。没有这个选项,一切正常。调整&lt;路径到&gt;像在mkspec中一样交叉编译器。

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

  4. -prefix / usr / local / qt5pi在RPi上安装Qt5的地方

  5. 现在所有要做的事情都是平常的: make / make install。该命令构建Qt5并将其安装在Raspberry Pi上的/ usr / qt5pi中。确保此位置存在正确的写入权限。

    还有一件事:

      

    qtwayland / SRC / hardwareintegration /客户端/ BRCM-EGL / qwaylandbrcmeglintegration.h

    在我编译qt5时包含了一个错误。 快速解决方法是编辑此文件:

    #include <QtWaylandClient/private/qwaylandclientbufferintegration_p.h>
    
    #include <wayland-client.h> <--- add this below the #include above.
    

    最后一件事:这个qt5 NOT 适合在Raspberry Pi中使用。创建程序时,必须安装RPi ,并且编译必须在具有编译Qt5的相同交叉编译器的同一主机下完成。

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

    编辑:我被告知这不是真的。不,它不是。但是,实际上,RPi不支持使用OpenGL的程序的xcb / X11。所以没有qtquick 2程序:http://lists.qt-project.org/pipermail/qtonpi/2012-October/001087.html

    目前没有什么可以做的,它的图形驱动程序根本就不支持它。 Wayland支持有限。最好的平台是eglfs。