# Qt 6 on the Raspberry Pi on eglfs

It has been some time since Qt 6 was released. Now that Qt 6.2 is almost out, I guess it is time to have a look at how Qt 6 runs on eglfs on a Raspberry Pi.

## Building Qt 6

Qt 6 moved from qmake to cmake. This makes a difference when trying to build it and cross-build it. Instructions on how to build are already available online from many sources, so I won’t repeat the theory here. I just want to note a few key points.

### Configuration

I configured this build in the simplest form. To start, I want to use eglfs on OpenGL ES.

### Toolchain

Building Qt requires a toolchain for building on the host and a toolchain to build for the target (the Raspberry Pi in this case). The toolchain from the host is typically provided by your distro (I used Manjaro in this case), while the toolchain to cross-build for the Raspberry Pi is officially provided here. In the past years I had a lot of weird problems building with those toolchains, so I started to create my own. Never had any problem anymore. Here you can find the toolchains:

• Raspberry OS Stretch: here;
• Raspberry OS Buster: here.

Please note that those toolchains are not always able to target every arch.

The one for Buster is the one I used in my build, and the target arch is armv8-a.

### Dependencies

Dependencies are already listed elsewhere. I would only like to note one thing here: I had problems linking because of a missing symbol: qt_resourceFeatureZstd. According to the sources, it seems that resources are compiled by the rcc tool. My guess is that the host tools use zstd by default to compress when available, but this is a problem when zstd is available on the host and not available on the target. Therefore, I suspect you have to decide if you want zstd support or not before building Qt 6 for the host, and be coherent with the build for the target. I decided to add zstd.

### Build Errors

I had a few build errors building Qt 6.2 beta3. Nothing particularly relevant, but I had to apply a few changes. I did not keep track of those changes, they were all trivial.

## Build Qt Test App

Once the Qt builds are ready, it is time to run. For the moment, I only want to do a quick test of QML. In my build, I forgot to set eglfs as the default platform, but it can be set it in the environment. I wrote a simple app to test Qt Quick here. The animations are very simple, but I wrote it like this to see how well many items are handled and how well the uniform movement on the y axis is rendered.

NOTE: Unlike Qt5, Qt6 includes host tools and tools built for the target. This means you can build the test app on the target directly or cross-build it from your host. For the package below anyway, you’d need to have a system compatible with those binaries.

## First App

This video shows a comparison of this Qt 6 build against Qt 5. It also shows the same benchmark app on Intel UHD and nVidia.

If you want to test the build of Qt 6 on your rpi, you can download it from here:

The package does not include the toolchain, that you can download from the other links, but includes the host build. I don’t think it will be of help, as it is built for my Manjaro context, but I placed it there anyway.

The positions of the directories are relevant:

• /opt/rpi/rpi-8.6.3: toolchain;
• /opt/Qt-x64-6.2.0-beta3: host build;
• /usr/local/Qt-rasp-6.2.0-beta3: position in the target;
• /opt/rpi/sysroot: sysroot for cross-building.

## Runtime Context

The is the 3D environment as seen by Qt 6:

qt.rhi.general: Created OpenGL context QSurfaceFormat(version 2.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 0, stencilBufferSize 8, samples 0, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QColorSpace(), profile  QSurfaceFormat::NoProfile)
qt.rhi.general: OpenGL VENDOR: Broadcom RENDERER: VC4 V3D 2.1 VERSION: OpenGL ES 2.0 Mesa 19.3.2
qt.scenegraph.general: MSAA sample count for the swapchain is 1. Alpha channel requested = no.
qt.scenegraph.general: rhi texture atlas dimensions: 2048x2048

Bye 😉

## 18 thoughts on “Qt 6 on the Raspberry Pi on eglfs”

1. udi says:

Hello Luca,

I have been trying to compile qt 6.2.4 crossly on my hosy (ubuntu 22) for raspberry pi 4. I see some cmake problems. Like

The link interface of target “Platform” contains:

* There is a typo in the target name.
* A find_package call is missing for an IMPORTED target.
* An ALIAS target is missing.

The link interface of target “WrapSystemHarfbuzz::WrapSystemHarfbuzz”
contains:

PkgConfig::PC_HARFBUZZ

* There is a typo in the target name.
* A find_package call is missing for an IMPORTED target.
* An ALIAS target is missing.

Call Stack (most recent call first):
cmake/QtFindPackageHelpers.cmake:130 (find_package)
src/gui/configure.cmake:41 (qt_find_package)
cmake/QtFeature.cmake:573 (include)
src/CMakeLists.txt:12 (qt_feature_evaluate_features)

Have you ever seen these before ?

1. Hello,
sorry, I did not encounter this issue before.

2. Spiz says:

Hi Luca, very thanks for your sharing… I guess you can help on this:
I use your toolchain for mac raspberry gcc 8.3, is build for armv8a but i’m on raspberry 3, i tried with simple hello world and it worked. My goal is building qt6 for crosscompile. So i have your toolchain, Raspberry 3 Buster, sysroot on my mac, i did toolchain.cmake but in any contest that i try i never found EGL and GLESv2 librarys.

I have this li in my $SYSROOT/opt/vc/lib. Did you think that is for toolchain build for armv8? i don’t think due to hello world and other compilation work. also from my mac to compile for raspberry Opengl call from triangle .c i use: /opt/rpi/rpi-gcc-8.3.0/bin/arm-linux-gnueabihf-gcc -c triangle.c -o triangle.o -I/opt/rpi/sysroot/opt/vc/include /opt/rpi/rpi-gcc-8.3.0/bin/arm-linux-gnueabihf-gcc -o triangle triangle.o -lbrcmEGL -lbrcmGLESv2 -lvcos -lbcm_host -lvchiq_arm -L/opt/rpi/sysroot/opt/vc/lib Any suggestion? 1. Hello, what does it mean “I never found”? What error is reported? 1. Spiz says: Configure summary: Building for: linux-g++ (arm, CPU features: neon) Compiler: gcc 8.3.0 Build options: Mode …………………………….. release Optimize release build for size …….. no Fully optimize release builds (-O3) …. no Building shared libraries ………….. yes Using C standard ………………….. C11 Using C++ standard ………………… C++17 Using ccache ……………………… no Using new DTAGS …………………… yes Relocatable ………………………. yes Using precompiled headers ………….. yes Using LTCG ……………………….. no Target compiler supports: Extensions ……………………… NEON Sanitizers: Addresses ………………………. no Threads ………………………… no Memory …………………………. no Fuzzer (instrumentation only) …….. no Undefined ………………………. no Build parts ………………………. libs Qt modules and options: Qt Concurrent …………………….. yes Qt D-Bus …………………………. yes Qt D-Bus directly linked to libdbus …. yes Qt Gui …………………………… yes Qt Network ……………………….. yes Qt PrintSupport …………………… yes Qt Sql …………………………… yes Qt Testlib ……………………….. yes Qt Widgets ……………………….. yes Qt Xml …………………………… yes Support enabled for: Using pkg-config ………………….. yes udev …………………………….. no Using system zlib …………………. yes Zstandard support …………………. no Thread support ……………………. yes Common build options: Linker can resolve circular dependencies yes Qt Core: backtrace ………………………… yes DoubleConversion ………………….. yes Using system DoubleConversion …….. no GLib …………………………….. yes ICU ……………………………… yes Using system libb2 ………………… no Built-in copy of the MIME database ….. yes Tracing backend …………………… Logging backends: journald ……………………….. no syslog …………………………. no slog2 ………………………….. no PCRE2 ……………………………. yes Using system PCRE2 ………………. no CLONE_PIDFD support in forkfd ………. yes Qt Sql: SQL item models …………………… yes Qt Network: getifaddrs() ……………………… yes IPv6 ifname ………………………. yes libproxy …………………………. no Linux AF_NETLINK ………………….. yes OpenSSL ………………………….. yes Qt directly linked to OpenSSL …….. no OpenSSL 1.1 ………………………. yes DTLS …………………………….. yes OCSP-stapling …………………….. yes SCTP …………………………….. no Use system proxies ………………… yes GSSAPI …………………………… no Brotli Decompression Support ……….. no Qt Gui: Accessibility …………………….. yes FreeType …………………………. yes Using system FreeType ……………. yes HarfBuzz …………………………. yes Using system HarfBuzz ……………. yes Fontconfig ……………………….. yes Image formats: GIF ……………………………. yes ICO ……………………………. yes JPEG …………………………… yes Using system libjpeg …………… yes PNG ……………………………. yes Using system libpng ……………. yes Text formats: HtmlParser ……………………… yes CssParser ………………………. yes OdfWriter ………………………. yes MarkdownReader ………………….. yes Using system libmd4c …………… no MarkdownWriter ………………….. yes EGL ……………………………… no OpenVG …………………………… no OpenGL: Desktop OpenGL ………………….. no OpenGL ES 2.0 …………………… no OpenGL ES 3.0 …………………… no OpenGL ES 3.1 …………………… no OpenGL ES 3.2 …………………… no Vulkan …………………………… yes Session Management ………………… yes Features used by QPA backends: evdev ……………………………. yes libinput …………………………. no INTEGRITY HID …………………….. no mtdev ……………………………. no tslib ……………………………. no xkbcommon ………………………… yes X11 specific: XLib …………………………… yes XCB Xlib ……………………….. no EGL on X11 ……………………… no xkbcommon-x11 …………………… no xcb-sm …………………………. no QPA backends: DirectFB …………………………. no EGLFS ……………………………. no EGLFS details: EGLFS OpenWFD …………………… no EGLFS i.Mx6 …………………….. no EGLFS i.Mx6 Wayland ……………… no EGLFS RCAR ……………………… no EGLFS EGLDevice …………………. no EGLFS GBM ………………………. no EGLFS VSP2 ……………………… no EGLFS Mali ……………………… no EGLFS Raspberry Pi ………………. no EGLFS X11 ………………………. no LinuxFB ………………………….. yes VNC ……………………………… yes VK_KHR_display ……………………. yes QNX: lgmon ………………………….. no IMF ……………………………. no XCB: Using system-provided xcb-xinput ….. no GL integrations: GLX Plugin ……………………. no XCB GLX …………………….. no EGL-X11 Plugin ………………… no Windows: Direct 2D ………………………. no Direct 2D 1.1 …………………… no DirectWrite …………………….. no DirectWrite 3 …………………… no Qt Widgets: GTK+ …………………………….. no Styles …………………………… Fusion Windows Qt Testlib: Tester for item models …………….. yes Qt PrintSupport: CUPS …………………………….. no Qt Sql Drivers: DB2 (IBM) ………………………… no InterBase ………………………… no MySql ……………………………. no OCI (Oracle) ……………………… no ODBC …………………………….. no PostgreSQL ……………………….. no SQLite …………………………… yes Using system provided SQLite ……… no ERROR: Feature “opengl”: Forcing to “ON” breaks its condition: QT_FEATURE_opengl_desktop OR QT_FEATURE_opengl_dynamic OR QT_FEATURE_opengles2 Condition values dump: QT_FEATURE_opengl_desktop = “OFF” QT_FEATURE_opengl_dynamic = “OFF” QT_FEATURE_opengles2 = “OFF” 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. CMake Error at cmake/QtBuildInformation.cmake:80 (message): Check the configuration messages for an error that has occurred. Call Stack (most recent call first): cmake/QtBuildInformation.cmake:11 (qt_configure_print_summary) cmake/QtBuildInternals/QtBuildInternalsConfig.cmake:472 (qt_print_feature_summary) CMakeLists.txt:174 (qt_build_repo_end) — Configuring incomplete, errors occurred! 1. Spiz says: I just found this in CMakeError.log: Performing C++ SOURCE FILE Test HAVE_EGL failed with the following output: Change Dir: /opt/rpi/qt6-rpi/CMakeFiles/CMakeTmp Run Build Command(s):/usr/local/bin/ninja cmTC_61c5e && [1/2] Building CXX object CMakeFiles/cmTC_61c5e.dir/src.cxx.o [2/2] Linking CXX executable cmTC_61c5e FAILED: cmTC_61c5e : && /opt/rpi/rpi-gcc-8.3.0/bin/arm-linux-gnueabihf-g++ –sysroot=/opt/rpi/sysroot -march=armv7-a -mfpu=neon -mfloat-abi=hard -Wl,-O1 -Wl,–hash-style=gnu -Wl,–as-needed -Wl,-rpath-link,/opt/rpi/sysroot/opt/vc/lib CMakeFiles/cmTC_61c5e.dir/src.cxx.o -o cmTC_61c5e && : /opt/rpi/rpi-gcc-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: CMakeFiles/cmTC_61c5e.dir/src.cxx.o: in function main’: src.cxx:(.text+0x1a): undefined reference to eglDestroyContext’ collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. Source file was: #include int main(int argc, char *argv[]) { EGLint x = 0; EGLDisplay dpy = 0; EGLContext ctx = 0; eglDestroyContext(dpy, ctx); } Performing C++ SOURCE FILE Test HAVE_GLESv2 failed with the following output: Change Dir: /opt/rpi/qt6-rpi/CMakeFiles/CMakeTmp Run Build Command(s):/usr/local/bin/ninja cmTC_85768 && [1/2] Building CXX object CMakeFiles/cmTC_85768.dir/src.cxx.o [2/2] Linking CXX executable cmTC_85768 FAILED: cmTC_85768 : && /opt/rpi/rpi-gcc-8.3.0/bin/arm-linux-gnueabihf-g++ –sysroot=/opt/rpi/sysroot -march=armv7-a -mfpu=neon -mfloat-abi=hard -Wl,-O1 -Wl,–hash-style=gnu -Wl,–as-needed -Wl,-rpath-link,/opt/rpi/sysroot/opt/vc/lib CMakeFiles/cmTC_85768.dir/src.cxx.o -o cmTC_85768 && : /opt/rpi/rpi-gcc-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: CMakeFiles/cmTC_85768.dir/src.cxx.o: in function main’: src.cxx:(.text+0x10): undefined reference to glUniform1f’ /opt/rpi/rpi-gcc-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: src.cxx:(.text+0x18): undefined reference to glClear’ collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. 1. Yes, the errors seem pretty clear: undefined reference to eglDestroyContext’ undefined reference to glUniform1f’ undefined reference to glClear’ So you’ll need to link to EGL and GLESv2 for the test to succeed. 1. Spiz says: Thanks for reply…! i did it with no good result. LIBEGL MBP-di-carmine:arm-linux-gnueabihf$ ls -la /opt/rpi/sysroot/usr/lib/arm-linux-gnueabihf/libEGL*
lrwxr-xr-x 1 root wheel 11 Feb 10 16:02 /opt/rpi/sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so -> libEGL.so.1
lrwxr-xr-x 1 root wheel 15 Feb 10 16:01 /opt/rpi/sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> libEGL.so.1.0.0
lrwxr-xr-x 1 root wheel 29 Feb 10 16:00 /opt/rpi/sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 -> ../../../opt/vc/lib/libEGL.so

LIBGLESv2
MBP-di-carmine:arm-linux-gnueabihf\$ ls -la libGLESv2*
lrwxr-xr-x 1 root wheel 14 Feb 10 16:11 libGLESv2.so -> libGLESv2.so.2
lrwxr-xr-x 1 root wheel 18 Feb 10 16:11 libGLESv2.so.2 -> libGLESv2.so.2.0.0
lrwxr-xr-x 1 root wheel 31 Feb 10 15:18 libGLESv2.so.2.0.0 -> sysroot/opt/vc/lib/libGLESv2.so

do you see something wrong here?

1. No, but the problem seemed not to be a missing file, but a symbol that could not be found. The compilation line was not linking to EGL or GLESv2.

3. No says:

1. Hello, if you are talking about the toolchians yes, probably my fault, sorry. Those are just links to the internal related articles. The articles are available in the blog. I’ll fix the links though, thanks for letting me know.

2. Links should be ok now. Thanks.

4. ahmed el banna says:

hi
could you share the configuration command

1. I’m sorry, I did not keep it. It was not different from the one you can find in many other articles anyway.

1. ahmed al banna says:

I make cross compile using your gcc toolchain
I just has the main issue here :

— Could NOT find EGL (missing: HAVE_EGL) (found version “1.5”)

I install all EGLdrivers (mesa , brcm)
and pass all paths to toochain.cmake
all packages can be found else EGL, GLES

1. No idea sorry. If configure cannot find EGL, it may mean the env is not setup properly. You can probably check for the exact error in the logs.

2. Mattia says:

Did you solve this issue? I’m in the same situation!

3. If you still have this problem, maybe you can fix as I suggested to Mattia: set rpath.