BRAS d'erreur de compilation, VFP enregistré par l'exécutable, pas de fichier de l'objet
J'ai eu ce problème depuis quelques jours et je ne peux pas obtenir ma tête autour de ce qui se passe vraiment ici, ou quel est le problème.
J'ai un makefile avec ces drapeaux:
CC = arm-linux-gnueabihf-gcc-4.6
FLAGS = -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -std=gnu99
J'ai une bibliothèque dans une .un fichier qui possède certains des fichiers d'objets, tout ce que je dois faire est de les lier avec mon exécutable. Je sais que les prototypes et tout ça, la seule chose qui se plaint est la suivante:
/usr/bin/ld: error: *EXECUTABLE* uses VFP register arguments, *OBJECTFILE* does not
/usr/bin/ld: failed to merge target specific data of file *OBJECTFILE*
Lorsque je n'utilise pas l'-mfloat-abi=softfp, je reçois une autre erreur relative à des registres virgule flottante.
Quelqu'un a une idée de ce qui est à l'origine de ce, et ce que je peux faire pour résoudre ce problème, telles que faire pour que mon fichier exécutable ne pas utiliser Virtual virgule Flottante Registre arguments?
x@x:~/Desktop/perf_test$ make
arm-linux-gnueabihf-gcc-4.6 -c -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -std=gnu99 -mfloat-abi=softfp perf_test.c ../baseline/util.c
arm-linux-gnueabihf-gcc-4.6 -o perf_test perf_test.o util.o ../baseline/lib.a
/usr/bin/ld: error: perf_test uses VFP register arguments, perf_test.o does not
/usr/bin/ld: failed to merge target specific data of file perf_test.o
/usr/bin/ld: error: perf_test uses VFP register arguments, util.o does not
/usr/bin/ld: failed to merge target specific data of file util.o
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(a.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(a.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(b.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(b.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(c.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(d.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(d.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(e.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(e.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(f.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(f.o)
collect2: ld returned 1 exit status
make: *** [perf_test] Error 1
Vous devez vous connecter pour publier un commentaire.
Votre cible triplet indique que votre compilateur est configuré pour le dur-float ABI. Cela signifie que le libgcc bibliothèque sera également hardfp. Le message d'erreur indique qu'au moins une partie de votre système à l'aide de soft-float ABI.
Si le compilateur a multilib activé (vous pouvez dire avec
-print-multi-lib
) alors vous pouvez utiliser-mfloat-abi=softfp
, mais si non, alors que l'option ne sera pas beaucoup vous aider: gcc sera heureux de générer softfp code, mais il n'y aura pas compatible libgcc de lien contre.Fondamentalement, hardfp et softfp sont tout simplement pas compatibles. Vous avez besoin pour obtenir l'ensemble de votre système est configuré d'une manière ou l'autre.
EDIT: certaines distributions sont, ou seront, "multiarch". Si vous avez un de ces il est alors possible d'installer les deux ABIs à la fois, mais c'est fait en doublant tout -- les problèmes de compatibilité existent encore.
-mfloat-abi=softfp
indicateur est ajouté à la fois le compilateur et l'éditeur de liens, sinon les erreurs persistentQue j'ai trouvé sur un bras hardfloat système où la glibc binutils et gcc ont été crosscompiled, en utilisant gcc donne la même erreur.
Il est résolu par l'exportation de
-mfloat-abi=hard
des drapeaux, puis gcc compile sans erreurs.Aussi l'erreur peut être résolu par l'ajout de plusieurs drapeaux, comme
-marm -mthumb-interwork
. Cela a été utile pour moi pour éviter ce même message d'erreur.C'est la conjecture, mais vous devrez peut-être fournir quelques-uns ou la totalité de la virgule flottante liées commutateurs pour le lien de la scène.
J'ai rencontré ce problème à l'aide Atollic pour les BRAS sur STM32F4 (je suppose qu'il s'applique à tous les microcontrôleurs STM32 avec FPU).
À l'aide de SW floating point n'a pas bien fonctionné pour moi (donc de compiler correctement).
Quand STM32cubeMX génère du code pour TrueStudio (Atollic), il ne définit pas de FPU de l'unité dans C/C++ paramètres de construction (pas sûr de code généré pour les autres Ide).
Définir une FPU dans "Cible" pour (sous Propriétés du projet paramètres de construction):
Ensuite, vous avez le choix de Mélanger HW/SW fp ou de l'utilisation HW.
Généré des lignes de commande sont ajoutés avec la cible visée:
brasatollic
Utiliser les mêmes options de compilation pour les liens aussi.
Exemple:
Dans mon cas
CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft
a aidé. Comme vous pouvez le voir, je l'ai utilisé pour mon stm32f407.J'ai été confronté au même problème. J'ai essayé de construire l'application linux pour Cyclone V FPGA SoC. J'ai rencontré le problème que ci-dessous:
J'ai été en utilisant l'ensemble des outils
arm-linux-gnueabihf-g++
fournis par le logiciel intégré à l'outil de conception d'altera.Il est résolu par l'exportation:
mfloat-abi=hard
des drapeaux, puisarm-linux-gnueabihf-g++
compile sans erreurs. Également inclure les drapeaux dans les deuxCC
&LD
.Dans mon cas particulier
-g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork
travaillé.Cette réponse peut apparaître à la surface n'a aucun rapport, mais il est une cause indirecte de ce message d'erreur.
Tout d'abord, les "Usages VFP enregistrer..." message d'erreur est causée directement à partir d'un mélange mfloat-abi=doux et mfloat-abi=dur d'options au sein de votre construction. Ce paramètre doit être uniforme pour tous les objets qui sont liés. Ce fait est bien couvert par les autres réponses à cette question.
La cause indirecte de cette erreur peut être due à l'Éclipse de l'éditeur de se confondre par une auto-infligées erreur dans le projet ".cproject de fichier". L'Éclipse de l'éditeur fréquemment reswizzles des liens vers des fichiers et parfois il se casse de lui-même lorsque vous apportez des modifications à votre structure de répertoire ou de fichier endroits. Cela peut également affecter les paramètres du chemin d'accès à votre compilateur gcc - et seulement pour un sous-ensemble des fichiers du projet. Alors que je ne suis pas encore sûr de exactement quelles sont les causes de cet échec, en remplacement de l' .cproject fichier avec une copie de sauvegarde corrigé ce problème pour moi. Dans mon cas, j'ai remarqué .java.la valeur null.pointeur erreurs après l'ajout d'un répertoire include chemin et a commencé à recevoir la "VFP registre d'erreur, les messages" out of the blue. Dans le journal, j'ai remarqué qu'un autre chemin vers le compilateur gcc a été utilisé pour certaines de mes sources locales à l'espace de travail, mais pas tous d'entre eux!? Les deux compilateurs gcc ont été à l'aide de différents float paramètres pour des raisons inconnues, d'où le VFP registre d'erreur.
J'ai comparé l' .cproject paramètres avec une ancienne copie et les différences observées dans les inscriptions pour les sources à l'origine du problème - même si le principal de paramètres du projet a été désactivé. En remplaçant le .cproject fichier avec l'ancienne version, le problème a disparu, et je pars de cette réponse comme un rappel de ce qui s'est passé.