2017-06-19 97 views
2

ラズベリーパイ3計算モジュールのqt 5.9をコンパイルしようとしています。ここでは主にオンラインガイド(https://wiki.qt.io/RaspberryPi2EGLFS)に従っています。そこで、piシステムのルートをマウントポイント/mnt/pi-rootfsに設定しました。また、シンボリックリンクを相対的なものに設定するには、sysroot-relativelinks.pyというスクリプトを使用します。ラズベリーパイのクロスコンパイル:GLESv2が見つかりません

qtbase構成は、次の引数で呼び出されました:

./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 

これはQT設定したが何のOpenGLと私はメッセージがありません:configファイルを見てみると

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. 

を、私が持っている:

> /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 

したがって、パスが正しく設定されていないため、を編集しましたファイル(linux-rpi3-g++)。だから、ファイルの関連部分は次のようになります。

だから、
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 

、私はすべてのVC_LIBRARY_PATHVC_INCLUDE_PATHで例えば、様々な場所で$$[QT_SYSROOT]プレフィックスを追加含まれており、私はそれがインクルードパスを見つけるために持っていてもいろいろなことを試してみましたGLES2ライブラリが好きではありませんでした(私はlibが確かに正しい場所にあることを確認しました:/mnt/pi-rootfs/opt/vc/lib)。

qt mkspecsファイルを編集したり、他のハッキングをしたりすることなく、うまくいけば、これを解決する方法についての提案がありますか?

EDIT だから、次のように私はmkspecsファイルを変更:

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 

をと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 

パス-L=/mnt/pi-rootfs/opt/vc/libが正しいですかこれがglesv2ライブラリが存在する場所であることを確認します。

+0

$$ [QT_SYSROOT]を前に付けて、新しいコンパイラコマンドをconfigureに貼り付けます。 –

+0

@LucaCarlon私の変更を見てください。これが私が試みたものです。 configureに 'sysroot'フラグがセットされています。もう何を試してみる必要がありますか?あなたは小さな例を投稿できますか? – Luca

答えて

2

これは私が使用qmake.confである(それは私のために働いていた):Raspbianストレッチ "RPI-アップデート" では

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) 
+0

それはうまくいった!共有ありがとう! – Luca

4

は/それ以外の場合は、 "libGLESv2.soは"/optに欠けている、呼び出されなければなりませんvc/lib。これは

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

+0

これを共有していただきありがとうございます。 – Luca

+1

何が起きているのか把握しようとしましたが、 –

+0

エラーが再びスローされているようですが、5.10.1のように見えます。 – tofutim

0

私の出発点は、2017年11月29日 - raspbianストレッチたとcrosstool-ngのを使用してOSXに私のツールチェーンを構築し、「-lGLESv2を見つけることができない」リンカエラーを修正します。

sudo rpi-updateは「libGLESv2.so」を手伝ってくれましたが、問題は解決しませんでした。この問題はQT構成にあることが判明しました。 QTはタプルを確立するためにgcc -dumpmachineを使用します。私にとっては 'arm-raspbian-linux-gnueabihf'でした。 QTは存在しない/usr/lib/arm-raspbian-linux-gnueabihfのような場所でライブラリとパッケージを検索します。 (GLESv2を使ってコンパイルしている間に、 'libpthread.so'のようなライブラリを見つけられなくなります。)代わりに、OSを見ると正しい場所は/usr/lib/arm-linux-gnueabihfです。解決方法は、qtbaseの 'configure.pri'を変更することです。

--- 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) 

これにより、タプルがcrosstool-ngからtripletに変更されます。 crosstool-ngを使用している場合、この「修正」の代わりに、CT_TARGET = arm-linux-gnueabihf(CT_TARGET_ALIASではなく)を使用することができます。

関連する問題