Sonntag, Mai 31, 2020

qt cross-compilation für raspberry pi: kann Nicht finden GLESv2

Ich versuche zu kompilieren qt 5.9 für meine raspberry pi-3-compute-Modul und ich verfolge hauptsächlich die online-Anleitung hier (https://wiki.qt.io/RaspberryPi2EGLFS). So, ich habe das pi-system Wurzeln, um den mount-Punkt /mnt/pi-rootfs. Ich habe auch die symlinks zu werden, relativ mit dem Skript sysroot-relativelinks.py.

Den qtbase Konfiguration aufgerufen wurde, mit folgenden argument:

./configure -opengl es2 -device linux-rpi3-g++ -device-option 
CROSS_COMPILE=/home/osboxes/Downloads/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- 
-sysroot /mnt/pi-rootfs -opensource -confirm-license -optimized-qmake 
-reduce-exports -release -make libs -prefix /usr/local/qt5pi 
-hostprefix /usr/local/qt5pi

Diese konfiguriert qt, aber kein openGL und habe ich die Meldung:

ERROR: Feature 'opengles2' was enabled, but the pre-condition 'config.win32 || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)' failed.

ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.

Check config.log for details.

Blick auf die config Datei habe ich:

> /home/osboxes/Downloads/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -c -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard --sysroot=/mnt/pi-rootfs --sysroot=/mnt/pi-rootfs -O2 -Wall -W -fPIC  -I. -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I/home/osboxes/Downloads/qt5/qtbase/mkspecs/devices/linux-rpi3-g++ -o opengles2.o opengles2.cpp
> opengles2.cpp:44:25: fatal error: GLES2/gl2.h: No such file or directory
>    #include <GLES2/gl2.h>
>                          ^
> compilation terminated.
> Makefile:179: recipe for target 'opengles2.o' failed
> make: *** [opengles2.o] Error 1
 => source failed verification.
test config.gui.libraries.opengl_es2 FAILED

So, es wird nicht die Pfade korrekt, also bearbeitete ich die mkspecs – Datei für linux-rpi3-g++. Also, den relevanten Teil der Datei sieht wie folgt aus:

QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib

VC_LIBRARY_PATH         = /opt/vc/lib
VC_INCLUDE_PATH         = /opt/vc/include

# terrible, they do not appear to resolve "=" in rpath!
VC_LINK_LINE            = -L=$${VC_LIBRARY_PATH} -Wl,-rpath-link,$$[QT_SYSROOT]$${VC_LIBRARY_PATH}

QMAKE_LIBDIR_OPENGL_ES2 = =$${VC_LIBRARY_PATH}
QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG     = $$QMAKE_LIBDIR_OPENGL_ES2

QMAKE_INCDIR_EGL        = \
                        $${VC_INCLUDE_PATH} \
                        $${VC_INCLUDE_PATH}/interface/vcos/pthreads \
                        $${VC_INCLUDE_PATH}/interface/vmcs_host/linux

QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}

QMAKE_LIBS_OPENGL_ES2   = $${VC_LINK_LINE} -lGLESv2

# The official opt vc EGL references GLESv2 symbols: need to link it
QMAKE_LIBS_EGL          = $${VC_LINK_LINE} -lEGL -lGLESv2

So, ich habe versucht, verschiedene Dinge, die alle enthalten das hinzufügen $$[QT_SYSROOT] Präfix an verschiedenen Orten, zum Beispiel auf VC_LIBRARY_PATH und VC_INCLUDE_PATH und obwohl ich habe es zu finden, die include-Pfad, könnte es nicht wie die GLES2 Bibliotheken (ich habe überprüft die libs sind zwar am richtigen Ort: /mnt/pi-rootfs/opt/vc/lib).

Ich Frage mich, wenn jemand hat Vorschläge, wie dieses Problem zu lösen, hoffentlich ohne Bearbeitung qt mkspecs Dateien und andere solche hacks.

BEARBEITEN
Also modifizierte ich die mkspecs-Datei wie folgt:

QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib

VC_LIBRARY_PATH         = $$[QT_SYSROOT]/opt/vc/lib  # prepended
VC_INCLUDE_PATH         = $$[QT_SYSROOT]/opt/vc/include #prepended

# terrible, they do not appear to resolve "=" in rpath!
VC_LINK_LINE            = -L=$${VC_LIBRARY_PATH} -Wl,-rpath-link,$$[QT_SYSROOT]$${VC_LIBRARY_PATH}

QMAKE_LIBDIR_OPENGL_ES2 = =$${VC_LIBRARY_PATH}
QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG     = $$QMAKE_LIBDIR_OPENGL_ES2

QMAKE_INCDIR_EGL        = \
                        $${VC_INCLUDE_PATH} \
                        $${VC_INCLUDE_PATH}/interface/vcos/pthreads \
                        $${VC_INCLUDE_PATH}/interface/vmcs_host/linux

QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}

#QMAKE_LIBS_OPENGL_ES2   = $${VC_LINK_LINE} -lGLESv2  #original
QMAKE_LIBS_OPENGL_ES2   = -lGLESv2  #changed

# The official opt vc EGL references GLESv2 symbols: need to link it
#QMAKE_LIBS_EGL          = $${VC_LINK_LINE} -lEGL -lGLESv2 #original
QMAKE_LIBS_EGL          = -lEGL -lGLESv2  #changed

Und diese Ergebnisse in der linking-Fehler, wenn Sie versuchen zu finden gles:

> /home/osboxes/Downloads/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -Wl,-rpath-link,/mnt/pi-rootfs/opt/vc/lib -Wl,-rpath-link,/mnt/pi-rootfs/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,/mnt/pi-rootfs/lib/arm-linux-gnueabihf -mfloat-abi=hard --sysroot=/mnt/pi-rootfs --sysroot=/mnt/pi-rootfs -Wl,-O1 -fuse-ld=gold -o opengles2 opengles2.o   -L=/mnt/pi-rootfs/opt/vc/lib -lGLESv2 
> /home/osboxes/Downloads/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/../../../../arm-linux-gnueabihf/bin/ld.gold: error: cannot find -lGLESv2
> opengles2.o:opengles2.cpp:function main: error: undefined reference to 'glUniform1f'
> opengles2.o:opengles2.cpp:function main: error: undefined reference to 'glClear'
> collect2: error: ld returned 1 exit status
> Makefile:65: recipe for target 'opengles2' failed

Den Pfad -L=/mnt/pi-rootfs/opt/vc/lib ist richtig und ich bestätige, dass dies ist, wo die glesv2 Bibliothek befindet.

  • Voranstellen $$[QT_SYSROOT] und fügen Sie die neue compiler-Befehl konfigurieren.
  • Siehe meine änderungen. Dies ist, was ich versucht habe. Ich habe die sysroot – flag in der Konfiguration. Was muss ich sonst noch versuchen? Kannst du ein kleines Beispiel?
InformationsquelleAutor Luca | 2017-06-19

3 Kommentare

  1. 3

    Dies ist die qmake.conf habe ich verwendet (es funktionierte für mich):

    include(../common/linux_device_pre.conf)
    
    QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib
    QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/home/pi/qtdeps/lib
    
    QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib
    QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2
    QMAKE_LIBDIR_OPENVG     = $$QMAKE_LIBDIR_OPENGL_ES2
    
    QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include \
                              $$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads \
                              $$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux
    
    QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
    QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
    
    QMAKE_LIBS_EGL          = -lEGL -lGLESv2
    QMAKE_LIBS_OPENVG       = -lEGL -lOpenVG -lGLESv2
    
    QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
    QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS
    
    DISTRO_OPTS            += hard-float
    DISTRO_OPTS            += deb-multi-arch
    
    # Preferred eglfs backend
    EGLFS_DEVICE_INTEGRATION= eglfs_brcm
    
    include(../common/linux_arm_device_post.conf)
    
    load(qt_config)
    • Das klappte! Vielen Dank für das teilen!
  2. 5

    In Raspbian Stretch „rpi-update“ aufgerufen werden muss, sonst „libGLESv2.so“ fehlt in /opt/vc/lib. Dies behebt die linker-Fehler „nicht finden können -lGLESv2“

    https://www.raspberrypi.org/forums/viewtopic.php?t=191638

    update: die zuvor genannten Lösung kann einige unerwünschte Nebenwirkungen. Daher empfehle ich dies zu tun, statt::

    ln -s libbrcmEGL.so /opt/vc/lib/libEGL.so
    ln -s libbrcmGLESv2.so /opt/vc/lib/libGLESv2.so
    ln -s libbrcmOpenVG.so /opt/vc/lib/libOpenVG.so
    ln -s libbrcmWFC.so /opt/vc/lib/libWFC.so
    • Vielen Dank für das teilen dieses.
    • Stunden damit verbracht, um herauszufinden, was Los war, danke
    • es scheint einen Fehler auslösen, wieder, aussieht wie 5.10.1 überprüft der Paket-manager
  3. 1

    Mein Ausgangspunkt war 2017-11-29-raspbian-Strecke und baute meine toolchain in OSX mit crosstool-ng.

    Während sudo rpi-update geholfen und gebracht in ‚libGLESv2.so‘, es nicht lösen das problem für mich. Die Frage stellte sich heraus, dass in der QT-Konfiguration. QT verwendet gcc -dumpmachine zu schaffen, die die Tupel. Für mich war es „arm-raspbian-linux-gnueabihf‘. QT endet die Suche nach Bibliotheken und Pakete, die in Orten wie /usr/lib/arm-raspbian-linux-gnueabihf die nicht existieren. (Es endet nicht zu finden, den Bibliotheken, wie ‚libpthread.so‘ beim kompilieren mit GLESv2.) Stattdessen, wenn Sie sich auf das OS, der richtige Standort ist /usr/lib/arm-linux-gnueabihf. Die Lösung ist, zu ändern “ konfigurieren.pri‘ in qtbase.

    --- a/configure.pri
    +++ b/configure.pri
    @@ -241,7 +241,7 @@ defineReplace(qtConfFunc_licenseCheck) {
    
     # this is meant for linux device specs only
     defineTest(qtConfTest_machineTuple) {
    -    qtRunLoggedCommand("$$QMAKE_CXX -dumpmachine", $${1}.tuple)|return(false)
    +    qtRunLoggedCommand("$$QMAKE_CXX -dumpmachine | sed 's/-raspbian//'", $${1}.tuple)|return(false)
         $${1}.cache += tuple
         export($${1}.cache)
         return(true)

    Dadurch ändert sich die Tupel aus crosstool-ng-an den Drilling.

    Update. Wenn Sie mit crosstool-ng, eine alternative zu diesem „fix“ ist zu verwenden CT_TARGET=arm-linux-gnueabihf (nicht CT_TARGET_ALIAS).

Kostenlose Online-Tests