2017-06-19 107 views
2

我試圖編譯qt 5.9我樹莓派3計算模塊,我一直在關注這裏主要的在線指南(https://wiki.qt.io/RaspberryPi2EGLFS)。因此,我已將pi系統根設置爲掛載點/mnt/pi-rootfs。我還使用腳本sysroot-relativelinks.py將符號鏈接設置爲相對。Qt跨編譯:找不到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和我有消息:

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 

所以,它沒有正確設置路徑,所以我編輯了mkspecs文件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庫(我已經驗證這些庫確實位於正確的位置:/mnt/pi-rootfs/opt/vc/lib)。

我不知道是否有人對如何有希望解決這個問題沒有編輯qt mkspecs文件和做其他這樣的黑客的建議。

編輯 所以,我修改了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(它的工作對我來說):

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

在Raspbian拉伸 「RPI-更新」 必須被調用,否則 「libGLESv2.so」 是在/ opt丟失/ VC/lib目錄下。這修復了連接錯誤「找不到-lGLESv2」

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。

雖然sudo rpi-update幫助並引入了'libGLESv2.so',但它並沒有解決我的問題。問題證明是在QT配置中。 QT使用gcc -dumpmachine來建立元組。對我來說,它是'arm-raspbian-linux-gnueabihf'。 QT最終在/usr/lib/arm-raspbian-linux-gnueabihf這類不存在的地方搜索庫和包。 (當使用GLESv2進行編譯時,最終無法找到像libpthread.so這樣的庫)。相反,如果您查看操作系統,則正確的位置是/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) 

這會將tuple從crosstool-ng更改爲三元組。

更新。如果您使用的是crosstool-ng,則此「修正」的替代方法是使用CT_TARGET = arm-linux-gnueabihf(而不是CT_TARGET_ALIAS)。