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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist die qmake.conf habe ich verwendet (es funktionierte für mich):
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::
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 verwendetgcc -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.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).