Skip to content

Qt X Compiling

IgorVais edited this page Aug 12, 2019 · 36 revisions

Intro

It is a quite common case when developing Qt based applications for an Embedded Linux system is carried out on a host machine with a different architecture. In order to prepare the host machine for X-compiling some manual configuration steps required.

This is a brief manual that shows:

Prerequisites

Assumptions

  • SDK install path is /opt/fsl-imx-xwayland/4.14-sumo

Requirements

  • Linux Debian/Ubuntu desktop
  • Install build-essential:
    sudo apt-get install build-essential
  • Install QtCreator:
    sudo apt-get install qtcreator
  • Yocto SDK with Qt5 support
    • Make sure that the SDK is installed:
    [[ -f /opt/fsl-imx-xwayland/4.14-sumo/environment-setup-aarch64-poky-linux ]] && echo "Installed" || echo "Not Installed"
    • Make sure that the Qt5 support is enabled:
    [[ -f /opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/qt5/qmake ]] && echo "enabled" || echo "off"

Using the SDK without QtCreator

  • open a terminal window and source the cross compiling environment setup:
. /opt/fsl-imx-xwayland/4.14-sumo/environment-setup-aarch64-poky-linux
  • make the Qt5 SDK examples available for the developer:
sudo chown ${USER}:${GROUPS} -R /opt/fsl-imx-xwayland/4.14-sumo/sysroots/aarch64-poky-linux/usr/share/qt5/examples
  • go to opengl/hellogl2 project directory:
cd /opt/fsl-imx-xwayland/4.14-sumo/sysroots/aarch64-poky-linux/usr/share/qt5/examples/opengl/hellogl2
  • issue the following sequence:
qmake -config release
make -j 8
  • issue file command and make sure that the produced binary is a valid ARM64 executable:
file hellogl2 | grep -q aarch64 && echo "good" || echo "bad"
  • if the file is good, copy this binary file to the target device and run it.
  • if the file is bad, re-issue the entire procedure.

Configure QtCreator for use with SDK

The following example shows how to setup QtCreator with Yocto Project SDK built using Sumo distribution for a Linux x86_64 host:

  • open a terminal application and source the cross compiling environment setup with:

    . /opt/fsl-imx-xwayland/4.14-sumo/environment-setup-aarch64-poky-linux
  • in the same terminal window start QtCreator:

    qtcreator
  • open the Tools, Options... menu and select the Kits section

  • use the following line as qmake location in Qt versions tab:

    /opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/qt5/qmake
  • use the following line as C compiler path and select ABI arm-linux-generic-elf-64bit in the Compilers tab:

    /opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc
  • use the following line as C++ compiler path and select ABI arm-linux-generic-elf-64bit in the Compilers tab:

    /opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++
  • use the following line as debugger path in Debuggers tab:

    /opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gdb
  • open the Devices section

  • in the Devices tab create a new device of type Generic Linux Device, specify IP address and authentication details:

  • return to the Kits section
  • create a new kit with name X-compile ARM 64bit selecting the configurations we just created
    use the following line as sysroot path:
    /opt/fsl-imx-xwayland/4.14-sumo/sysroots/aarch64-poky-linux
  • click Apply and exit Qt Creator

Building a project using QtCreator

ℹ️ Make sure that the how to configure and use the SDK inside QtCreator ⤴️ was carried out first.

  • open a terminal window and source the cross compiling environment setup:
. /opt/fsl-imx-xwayland/4.14-sumo/environment-setup-aarch64-poky-linux
  • start QtCreator in the same terminal window:
qtcreator
  • create a new example project using the Qt Widgets Application template
  • name the project hello-qt
  • select the X-compile ARM 64bit kit we just created and finish
  • edit the hello-qt.pro adding:
# install
target.path=/home/root/
INSTALLS += target
  • build the project