J'ai eu l'erreur ci-dessous lors de la compilation croisée d'un programme helloworld sur Ubuntu 16.04 64 bits, pour la plate-forme Cortex A9 32 bits.
$ make
/usr/local/comp/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mtune=cortex-a9 --sysroot=/usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi -Iinclude -Wall -O3 -c -o main.o main.c
In file included from /usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/features.h:389:0,
from /usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/stdio.h:27,
from main.c:5:
/usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
# include <gnu/stubs-soft.h>
^
compilation terminated.
makefile:45: recipe for target 'main.o' failed
make: *** [main.o] Error 1
J'examine ensuite le contenu du fichier stubs.h:
$ cat /usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/gnu/stubs.h
/* This file is automatically generated.
This file selects the right generated file of `__stub_FUNCTION' macros
based on the architecture being compiled for. */
#if !defined __ARM_PCS_VFP
# include <gnu/stubs-soft.h>
#endif
#if defined __ARM_PCS_VFP
# include <gnu/stubs-hard.h>
#endif
Dois-je définir le _ARM_PCS_VFP
dans le makefile?
Du nom de votre compilateur croisé, "cortexa9hf-vfp-neon-poky-linux-gnueabi", il cible le Cortex-A9 avec l'architecture VFP et le néon activé. Ajouter -mfloat-abi=hard
le commutateur devrait résoudre le problème.
Du manuel GCC:
-mfloat-abi = nom:
Spécifie l'ABI à virgule flottante à utiliser. Les valeurs autorisées sont: "soft", "softfp" et "hard".
Si vous spécifiez "soft", GCC génère une sortie contenant des appels de bibliothèque pour les opérations à virgule flottante. ‘Softfp’ permet la génération de code à l'aide d'instructions matérielles à virgule flottante, mais utilise toujours les conventions d'appel soft-float. ‘Hard’ permet de générer des instructions à virgule flottante et utilise des conventions d’appel spécifiques aux FPU.
La valeur par défaut dépend de la configuration cible spécifique. Notez que les ABI flottant et flottant ne sont pas compatibles avec les liaisons; vous devez compiler l'intégralité de votre programme avec le même ABI et établir un lien avec un ensemble de bibliothèques compatible.