Building static Qt for embedded devices (cross-compile) fails



  • I'm trying to build Qt statically for several embedded devices I have (all with an iMX6 processor). They all have old and different versions of Qt, so for testing I'm trying to build Qt 5.13 statically so we can do some testing. I'm able to build Qt statically for my host machine. My issue is what I add the options to build for the cross compile. The cross compile toolchain I'm using is debian stretch for armhf, which is comparable with my device and currently able to make dynamic Qt 5.9 builds. So I believe this should be able to build Qt 5.13.

    Here is the command I'm running for configure:

    ./configure -static -release -verbose -opensource -ltcg -no-pch -prefix $PWD/build/target -hostprefix $PWD/build/host -device linux-imx6-g++ -device-option CROSS_COMPILE=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf- -sysroot /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/ -skip webengine -nomake tools -nomake tests -nomake examples
    

    Here is the output:

    dlogic@dlogic-vm:~/qt-everywhere-src-5.13.0$ ./configure -static -release -verbose -opensource -ltcg -no-pch -prefix $PWD/build/target -hostprefix $PWD/build/host -device linux-imx6-g++ -device-option CROSS_COMPILE=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf- -sysroot /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/ -skip webengine -nomake tools -nomake tests -nomake examples
    + cd qtbase
    + /home/dlogic/qt-everywhere-src-5.13.0/qtbase/configure -top-level -static -release -verbose -opensource -ltcg -no-pch -prefix /home/dlogic/qt-everywhere-src-5.13.0/build/target -hostprefix /home/dlogic/qt-everywhere-src-5.13.0/build/host -device linux-imx6-g++ -device-option CROSS_COMPILE=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf- -sysroot /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/ -skip webengine -nomake tools -nomake tests -nomake examples
    Creating qmake...
    make: Nothing to be done for 'first'.
    Command line: -static -release -verbose -opensource -ltcg -no-pch -prefix /home/dlogic/qt-everywhere-src-5.13.0/build/target -hostprefix /home/dlogic/qt-everywhere-src-5.13.0/build/host -device linux-imx6-g++ -device-option CROSS_COMPILE=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf- -sysroot /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/ -skip webengine -nomake tools -nomake tests -nomake examples
    
    This is the Qt Open Source Edition.
     
    You are licensed to use this software under the terms of
    the GNU Lesser General Public License (LGPL) version 3
    or the GNU General Public License (GPL) version 2.
     
    Type 'L' to view the GNU Lesser General Public License version 3 (LGPLv3).
    Type 'G' to view the GNU General Public License version 2 (GPLv2).
    Type 'y' to accept this license offer.
    Type 'n' to decline this license offer.
     
    Do you accept the terms of either license? y
    
    
    Running configuration tests...
    Checking for machine tuple... 
    + /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ -dumpmachine
    > /lib/ld-linux-armhf.so.3: No such file or directory
    test config.qtbase.tests.machineTuple FAILED
    Checking for valid makespec... 
    + cd /home/dlogic/qt-everywhere-src-5.13.0/config.tests/verifyspec && /home/dlogic/qt-everywhere-src-5.13.0/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += static warn_off console single_arch" "QMAKE_CFLAGS += --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/" "QMAKE_CXXFLAGS += --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/" "QMAKE_LFLAGS += --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/" -early "CONFIG += cross_compile" /home/dlogic/qt-everywhere-src-5.13.0/qtbase/config.tests/verifyspec
    + cd /home/dlogic/qt-everywhere-src-5.13.0/config.tests/verifyspec && MAKEFLAGS= /usr/bin/make clean && MAKEFLAGS= /usr/bin/make
    > rm -f verifyspec.o
    > rm -f *~ core *.core
    > /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ -c -pipe -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1 -mfloat-abi=hard --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/ -O2 -w -fPIC  -I/home/dlogic/qt-everywhere-src-5.13.0/qtbase/config.tests/verifyspec -I. -I/home/dlogic/qt-everywhere-src-5.13.0/qtbase/mkspecs/devices/linux-imx6-g++ -o verifyspec.o /home/dlogic/qt-everywhere-src-5.13.0/qtbase/config.tests/verifyspec/verifyspec.cpp
    > /lib/ld-linux-armhf.so.3: No such file or directory
    > Makefile:182: recipe for target 'verifyspec.o' failed
    > make: *** [verifyspec.o] Error 255
    Note: Also available for Linux: linux-clang linux-icc
    
    ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken.
    

    Seems to be a path issue but I'm not sure what needs changed.
    The file /lib/ld-linux-armhf.so.3 does exist in the rootfs for the device BSP.


  • Lifetime Qt Champion

    Hi,

    You should also pass the sysroot option and point it to the sysroot of your device in order for configure to find the dependencies for the correct platform.



  • Hi @SGaist

    I do pass the -sysroot option:

    -sysroot /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/
    

  • Lifetime Qt Champion

    I just realised: make: Nothing to be done for 'first'. Are you cross-compiling from a clean state ? It doesn't look like it.

    One recommandation: use out of source builds. This way you don't have to clean the sources between two builds and if something goes wrong, you can simply nuke the folder and start fresh.



  • Hi @SGaist

    I've deleted the directory and started the build over. This time it build qmake successfully but still fails at the same spot, but with a different error. This time the machine tuple check succeeded, but still thinks the toolchain or QMakeSpec is broken. Again this same toolchain successfully builds Qt 5.9.

    Running configuration tests...
    Checking for machine tuple... 
    + /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ -dumpmachine
    > arm-linux-gnueabihf
    test config.qtbase.tests.machineTuple succeeded
    Checking for valid makespec... 
    + cd /home/dlogic/qt-everywhere-src-5.13.0/config.tests/verifyspec && /home/dlogic/qt-everywhere-src-5.13.0/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += static warn_off console single_arch" "QMAKE_CFLAGS += --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/" "QMAKE_CXXFLAGS += --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/" "QMAKE_LFLAGS += --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/" -early "CONFIG += cross_compile" /home/dlogic/qt-everywhere-src-5.13.0/qtbase/config.tests/verifyspec
    + cd /home/dlogic/qt-everywhere-src-5.13.0/config.tests/verifyspec && MAKEFLAGS= /usr/bin/make
    > /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ -c -pipe -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1 -mfloat-abi=hard --sysroot=/home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/ -O2 -w -fPIC  -I/home/dlogic/qt-everywhere-src-5.13.0/qtbase/config.tests/verifyspec -I. -I/home/dlogic/qt-everywhere-src-5.13.0/qtbase/mkspecs/devices/linux-imx6-g++ -o verifyspec.o /home/dlogic/qt-everywhere-src-5.13.0/qtbase/config.tests/verifyspec/verifyspec.cpp
    > Assembler messages:
    > Fatal error: invalid -march= option: `armv7-a'
    > Makefile:180: recipe for target 'verifyspec.o' failed
    > make: *** [verifyspec.o] Error 2
    Note: Also available for Linux: linux-clang linux-icc
    
    ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken.
    

    Also the GCC cross-compiler is version 6.3.0

    $ /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ --version
    arm-linux-gnueabihf-g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
    Copyright (C) 2016 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    

  • Lifetime Qt Champion

    @mjohn said in Building static Qt for embedded devices (cross-compile) fails:

    armv7-a

    Did you try running arm-linux-gnueabihf-g++ -march=armv7-a



  • Hi @SGaist

    Yes, and it seems to accept the option:

    $ arm-linux-gnueabihf-g++ -march=armv7-a
    arm-linux-gnueabihf-g++: fatal error: no input files
    compilation terminated.
    
    $ cat /tmp/test.c
    #include <stdio.h>
    
    int main(void) {
        return 0;
    }
    $ arm-linux-gnueabihf-g++ -march=armv7-a /tmp/test.c
    $ echo $?
    0
    

  • Lifetime Qt Champion

    @mjohn said in Building static Qt for embedded devices (cross-compile) fails:

    /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++

    Might be a silly question but are you sure that this is the one you are currently calling when doing just "arm-linux-gnueabihf-g++" ?



  • Hi @SGaist

    Not a silly question, turns out it was not!
    Now when I use the full path to ensure I'm using the expected compiler I get the same 'invalid option' error. So for some reason my cross compiler doesn't support the board?

    $ /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ -march=armv7-a /tmp/test.c -I /home/dlogic/Development/fs/debian/dl-dm-x/debian-stretch-armhf-eglfb_imx-viv_dlogic-dm-dev/usr/include/arm-linux-gnueabihf/
    Assembler messages:
    Fatal error: invalid -march= option: `armv7-a'
    

  • Lifetime Qt Champion

    Can you print which version of g++ this one is ?



  • Hi @SGaist

    GCC version 6.3.0

    dlogic@dlogic-vm:~/qt-everywhere-src-5.13.0$ /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ --version
    arm-linux-gnueabihf-g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
    Copyright (C) 2016 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    dlogic@dlogic-vm:~/qt-everywhere-src-5.13.0$ arm-linux-gnueabihf-g++ --version
    arm-linux-gnueabihf-g++ (Debian 6.3.0-18) 6.3.0 20170516
    Copyright (C) 2016 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    

  • Lifetime Qt Champion

    Strange... Looks like it's recent enough.

    What does the --target-help option return ?



  • @SGaist

    Running --target-help below. Strange thing is it prints the error at the very end of this, even though the option was not provided.

    $ /home/dlogic/Development/fs/debian-stretch-armhf-rootfs_dl-dm-x/usr/bin/arm-linux-gnueabihf-g++ --target-help
    The following options are target specific:
      -mabi=                      Specify an ABI.
      -mabort-on-noreturn         Generate a call to abort if a noreturn function returns.
      -mandroid                   Generate code for the Android platform.
      -mapcs-float                Pass FP arguments in FP registers.
      -mapcs-frame                Generate APCS conformant stack frames.
      -mapcs-reentrant            Generate re-entrant, PIC code.
      -march=                     Specify the name of the target architecture.
      -marm                       Generate code in 32 bit ARM state.
      -masm-syntax-unified        Assume unified syntax for inline assembly code.
      -mbig-endian                Assume target CPU is configured as big endian.
      -mbionic                    Use Bionic C library.
      -mcallee-super-interworking Thumb: Assume non-static functions may be called from ARM code.
      -mcaller-super-interworking Thumb: Assume function pointers may go to non-Thumb aware code.
      -mcpu=                      Specify the name of the target CPU.
      -mfix-cortex-m3-ldrd        Avoid overlapping destination and address registers on LDRD instructions that may trigger Cortex-M3 errata.
      -mfloat-abi=                Specify if floating point hardware should be used.
      -mfp16-format=              Specify the __fp16 floating-point format.
      -mfpu=                      Specify the name of the target floating point hardware/format.
      -mglibc                     Use GNU C library.
      -mlittle-endian             Assume target CPU is configured as little endian.
      -mlong-calls                Generate call insns as indirect calls, if necessary.
      -mmusl                      Use musl C library.
      -mneon-for-64bits           Use Neon to perform 64-bits operations rather than core registers.
      -mnew-generic-costs         Use the new generic RTX cost tables if new core-specific cost table not available (transitional).
      -mold-rtx-costs             Use the old RTX costing tables (transitional).
      -mpic-data-is-text-relative Assume data segments are relative to text segment.
      -mpic-register=             Specify the register to be used for PIC addressing.
      -mpoke-function-name        Store function names in object code.
      -mprint-tune-info           Print CPU tuning information as comment in assembler file.  This is an option used only for regression testing of the compiler and
                                  not intended for ordinary use in compiling code.
      -mrestrict-it               Generate IT blocks appropriate for ARMv8.
      -msched-prolog              Permit scheduling of a function's prologue sequence.
      -msingle-pic-base           Do not load the PIC register in function prologues.
      -mslow-flash-data           Assume loading data from flash is slower than fetching instructions.
      -mstructure-size-boundary=  Specify the minimum bit alignment of structures.
      -mthumb                     Generate code for Thumb state.
      -mthumb-interwork           Support calls between Thumb and ARM instruction sets.
      -mtls-dialect=              Specify thread local storage scheme.
      -mtp=                       Specify how to access the thread pointer.
      -mtpcs-frame                Thumb: Generate (non-leaf) stack frames even if not needed.
      -mtpcs-leaf-frame           Thumb: Generate (leaf) stack frames even if not needed.
      -mtune=                     Tune code for the given processor.
      -muclibc                    Use uClibc C library.
      -munaligned-access          Enable unaligned word and halfword accesses to packed data.
      -mvectorize-with-neon-double Use Neon double-word (rather than quad-word) registers for vectorization.
      -mvectorize-with-neon-quad  Use Neon quad-word (rather than double-word) registers for vectorization.
      -mword-relocations          Only generate absolute relocations on word sized values.
    
      Known ARM ABIs (for use with the -mabi= option):
        aapcs aapcs-linux apcs-gnu atpcs iwmmxt
    
      Known ARM architectures (for use with the -march= option):
        armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5e armv5t armv5te armv6 armv6-m armv6j armv6k armv6kz armv6s-m armv6t2 armv6z armv6zk armv7 armv7-a armv7-m
        armv7-r armv7e-m armv7ve armv8-a armv8-a+crc armv8.1-a armv8.1-a+crc iwmmxt iwmmxt2 native
    
      Known __fp16 formats (for use with the -mfp16-format= option):
        alternative ieee none
    
      Known ARM FPUs (for use with the -mfpu= option):
        crypto-neon-fp-armv8 fp-armv8 fpv4-sp-d16 fpv5-d16 fpv5-sp-d16 neon neon-fp-armv8 neon-fp16 neon-vfpv4 vfp vfp3 vfpv3 vfpv3-d16 vfpv3-d16-fp16 vfpv3-fp16
        vfpv3xd vfpv3xd-fp16 vfpv4 vfpv4-d16
    
      Valid arguments to -mtp=:
        auto cp15 soft
    
      Known floating-point ABIs (for use with the -mfloat-abi= option):
        hard soft softfp
    
      Known ARM CPUs (for use with the -mcpu= and -mtune= options):
        arm1020e arm1020t arm1022e arm1026ej-s arm10e arm10tdmi arm1136j-s arm1136jf-s arm1156t2-s arm1156t2f-s arm1176jz-s arm1176jzf-s arm2 arm250 arm3 arm6 arm60
        arm600 arm610 arm620 arm7 arm70 arm700 arm700i arm710 arm7100 arm710c arm710t arm720 arm720t arm740t arm7500 arm7500fe arm7d arm7di arm7dm arm7dmi arm7m
        arm7tdmi arm7tdmi-s arm8 arm810 arm9 arm920 arm920t arm922t arm926ej-s arm940t arm946e-s arm966e-s arm968e-s arm9e arm9tdmi cortex-a12 cortex-a15
        cortex-a15.cortex-a7 cortex-a17 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a5 cortex-a53 cortex-a57 cortex-a57.cortex-a53 cortex-a7 cortex-a72
        cortex-a72.cortex-a53 cortex-a8 cortex-a9 cortex-m0 cortex-m0.small-multiply cortex-m0plus cortex-m0plus.small-multiply cortex-m1 cortex-m1.small-multiply
        cortex-m3 cortex-m4 cortex-m7 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 ep9312 exynos-m1 fa526 fa606te fa626 fa626te fa726te fmp626 generic-armv7-a
        iwmmxt iwmmxt2 marvell-pj4 mpcore mpcorenovfp native qdf24xx strongarm strongarm110 strongarm1100 strongarm1110 xgene1 xscale
    
      TLS dialect to use:
        gnu gnu2
    
    Assembler options
    =================
    
    Use "-Wa,OPTION" to pass "OPTION" to the assembler.
    
    Assembler messages:
    Fatal error: invalid -march= option: `armv7-a'
    

  • Lifetime Qt Champion

    Who did provide you with that cross-toolchain ?



  • @SGaist

    From the vendor, DLOGIC. They provided the eval board and a VirtualBox VM with the toolchain included.


  • Lifetime Qt Champion

    Then I would recommend asking them about the missing architecture.



  • I got a new toolchain and was successful in building a static version of Qt.
    Thanks for the help @SGaist .


Log in to reply