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. -
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.
-
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.
-
@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
-
@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'
-
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.
-
Strange... Looks like it's recent enough.
What does the
--target-help
option return ? -
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'
-
Who did provide you with that cross-toolchain ?
-
Then I would recommend asking them about the missing architecture.