在閱讀本文之前,請(qǐng)先參考我的另一篇文章:
http://www.itdecent.cn/p/3b5c0e0fd674
其中有講解編譯鏈工具的下載和配置,以及QT5.9.9源碼的編譯,但是上次是沒(méi)有配置OpenGL的,所以涉及3D渲染的開(kāi)發(fā)是沒(méi)法使用的,這次重新來(lái)過(guò),主要解決OpenGL的編譯問(wèn)題。
配置QT源碼:
同樣地解壓QT5.9.9的源碼到armv7l目錄。
進(jìn)入QT源碼根目錄,在qtbase/mkspecs子目錄下已經(jīng)為各種平臺(tái)準(zhǔn)備好了相應(yīng)的編譯配置,
但是我們這里是linux-arm-gnueabihf平臺(tái),發(fā)現(xiàn)找不到,復(fù)制一個(gè)來(lái)修改:
cp linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++ -r
編輯linux-arm-gnueabihf-g++/qmake.conf,把里面的arm-linux-gnueabi改成arm-linux-gnueabihf,修改內(nèi)容如下:
#
# qmake configuration for building with arm-linux-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 = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
回到QT源碼根目錄,繼續(xù)執(zhí)行:
mkdir build
cd build
然后創(chuàng)建autoconfig.sh,輸入如下內(nèi)容:
#!/bin/bash
rm config.cache
SYSROOT=/home/kdjie/armv7l/sysroot-glibc-linaro-2.25-2019.12-arm-linux-gnueabihf
PREFIX=/home/kdjie/armv7l
../configure \
-v \
-confirm-license -opensource \
-prefix ${PREFIX}/qt5.9.9 \
-sysroot ${SYSROOT} \
-xplatform linux-arm-gnueabihf-g++ \
-no-pch -no-pkg-config -release -shared -make libs \
-nomake examples -nomake tests \
-xcb -xcb-xlib -no-eglfs \
-qpa xcb \
-linuxfb \
-opengl es2
然后執(zhí)行:
chmod +x autoconfig.sh
./autoconfig.sh
稍等幾分鐘,不出意外的話(huà)會(huì)提示如下錯(cuò)誤:
Note: No wayland-egl support detected. Cross-toolkit compatibility disabled.
WARNING: Feature xcb-xlib is insignificant in this configuration, ignoring related command line option(s).
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.
解決問(wèn)題:
查看config.log文件內(nèi)容,它記錄了配置過(guò)程的細(xì)節(jié),搜索”ES2",找到如下內(nèi)容:
> main.cpp:6:12: fatal error: GLES2/gl2.h: 沒(méi)有那個(gè)文件或目錄
> # include <GLES2/gl2.h>
> ^~~~~~~~~~~~~
> compilation terminated.
> gmake: *** [main.o] 錯(cuò)誤 1
=> source failed verification.
test config.gui.libraries.opengl_es2 FAILED
顯示缺少GLES2/gl2.h,我們可以去樹(shù)莓派鏡像上找,關(guān)于樹(shù)莓派鏡像文件的提取,請(qǐng)參考本人另一篇文章:
http://www.itdecent.cn/p/41879d5864f8
進(jìn)入樹(shù)莓派系統(tǒng)目錄后,執(zhí)行:
[root@localhost raspios_rootfs]# find . | grep gl2.h
./opt/vc/include/GLES2/gl2.h
拷貝頭文件:
cd /home/kdjie/armv7l/sysroot-glibc-linaro-2.25-2019.12-arm-linux-gnueabihf/usr/include
拷貝GLES2所需的頭文件:
cp /mnt/raspios_rootfs/opt/vc/include/GLES2 . -r -i
cp /mnt/raspios_rootfs/opt/vc/include/KHR . -r -i
或者全拷:
cp /mnt/raspios_rootfs/opt/vc/include/* . -r -i
然后重新執(zhí)行autoconfig.sh,仍然配置不通過(guò),繼續(xù)查看錯(cuò)誤細(xì)節(jié),找到如下內(nèi)容:
> /home/kdjie/armv7l/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/7.5.0/../../../../arm-linux-gnueabihf/bin/ld.gold: error: cannot find -lGLESv2
> main.o:main.cpp:function main: error: undefined reference to 'glUniform1f'
> main.o:main.cpp:function main: error: undefined reference to 'glClear'
> collect2: error: ld returned 1 exit status
> gmake: *** [opengl_es2] 錯(cuò)誤 1
=> source failed verification.
test config.gui.libraries.opengl_es2 FAILED
顯示缺少libGLESv2.so這個(gè)文件,再到樹(shù)莓派系統(tǒng)目錄中找:
[root@localhost raspios_rootfs]# find . | grep libGLESv2.so
./opt/minecraft-pi/lib/brcm/libGLESv2.so
./opt/minecraft-pi/lib/mesa/libGLESv2.so
./usr/lib/scratch3/swiftshader/libGLESv2.so
./usr/lib/scratch3/libGLESv2.so
./usr/lib/chromium-browser/swiftshader/libGLESv2.so
./usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0
./usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
拷貝庫(kù):
cd /home/kdjie/armv7l/sysroot-glibc-linaro-2.25-2019.12-arm-linux-gnueabihf/usr/lib
cp /mnt/raspios_rootfs/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 . -i
ln -s libGLESv2.so.2.1.0 libGLESv2.so
ln -s libGLESv2.so.2.1.0 libGLESv2.so.2
這里建立了兩個(gè)符號(hào)鏈接,其中l(wèi)ibGLESv2.so.2是后面編譯應(yīng)用程序的時(shí)候要用。
還有要注意:
libGLESv2.so 通常情況下會(huì)依賴(lài) libGLdispatch.so,我里一并把它拷貝過(guò)來(lái)。
到樹(shù)莓派系統(tǒng)目錄中找:
[root@localhost raspios_rootfs]# find . | grep libGLdispatch.so
./usr/lib/arm-linux-gnueabihf/libGLdispatch.so.0
./usr/lib/arm-linux-gnueabihf/libGLdispatch.so.0.0.0
拷貝庫(kù):
cd /home/kdjie/armv7l/sysroot-glibc-linaro-2.25-2019.12-arm-linux-gnueabihf/usr/lib
cp /mnt/raspios_rootfs/usr/lib/arm-linux-gnueabihf/libGLdispatch.so.0.0.0 . -i
ln -s libGLdispatch.so.0.0.0 libGLdispatch.so.0
繼續(xù)重新執(zhí)行autoconfig.sh,終于配置通過(guò):
OpenGL:
Desktop OpenGL ....................... no
OpenGL ES 2.0 ........................ yes
OpenGL ES 3.0 ........................ no
OpenGL ES 3.1 ........................ no
......
Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into '/home/kdjie/armv7l/sysroot-glibc-linaro-2.25-2019.12-arm-linux-gnueabihf/home/kdjie/armv7l/qt5.9.9'.
編譯:
make
在我的i5機(jī)器上大約等待3個(gè)小時(shí),編譯完成后,安裝:
make install
qt5.9.9軟件包將被放到 {PREFIX} 指定的目錄下,我這里是/home/kdjie/armv7l/sysroot-glibc-linaro-2.25-2019.12-arm-linux-gnueabihf/home/kdjie/armv7l。