Ошибка компиляции ARM, зарегистрированный VFP, используемый исполняемым, а не объектным файлом
у меня была эта проблема в течение последних нескольких дней, и я не могу понять, что на самом деле происходит здесь, или в чем проблема.
у меня есть Makefile с этими флагами:
CC = arm-linux-gnueabihf-gcc-4.6
FLAGS = -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -std=gnu99
у меня в библиотеке .файл, который имеет некоторые объектные файлы, все, что мне нужно сделать, это связать их с моей исполняемый. Я знаю прототипы и все такое, единственное, что жалуется, это следующее:
/usr/bin/ld: error: *EXECUTABLE* uses VFP register arguments, *OBJECTFILE* does not
/usr/bin/ld: failed to merge target specific data of file *OBJECTFILE*
когда я не использую-mfloat-abi=softfp, Я получаю еще одну ошибку, связанную с регистрами с плавающей запятой.
кто-нибудь знает, что вызывает это, и что я могу сделать, чтобы исправить это, например, сделать так, чтобы мой исполняемый файл не использовал виртуальные аргументы регистра с плавающей запятой?
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
10 ответов:
ваш целевой триплет указывает, что ваш компилятор настроен для hard-float ABI. Это означает, что библиотека libgcc также будет hardfp. Сообщение об ошибке указывает, что по крайней мере часть вашей системы использует soft-float ABI.
если компилятор имеет multilib включен (вы можете сказать с
-print-multi-lib
), то вы можете использовать-mfloat-abi=softfp
, но если нет, то эта опция вам не очень поможет: gcc с радостью создаст код softfp, но тогда его не будет совместимость на libgcc, чтобы связать против.в основном, hardfp и softfp просто не совместимы. Вам нужно настроить всю вашу систему так или иначе.
редактировать: некоторые дистрибутивы, или будет "одновременной". Если у вас есть один из них, то можно установить и ABIs сразу, но это делается путем удвоения всего-проблемы совместимости все еще существуют.
Я нашел на ARM hardfloat системы, где glibc binutils и gcc были скомпилированы, используя gcc дает ту же ошибку.
Это решается путем экспорта
-mfloat-abi=hard
для флагов, затем gcc компилируется без ошибок.
также ошибка может быть решена путем добавления нескольких флагов, например
-marm -mthumb-interwork
. Это было полезно для меня, чтобы избежать этой же ошибки.
это догадки, но вам может понадобиться поставить некоторые или все переключатели, связанные с плавающей точкой, для этапа link.
использовать те же параметры компилятора для связывания также.
пример:
gcc -mfloat-abi=hard fpu=neon -c -o test.cpp test.o gcc -mfloat-abi=hard fpu=neon -c test1.cpp test1.o gcc test.o test1.o mfloat-abi=hard fpu=neon HardTest
в моем случае
CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft
помогло. Как вы можете видеть, я использовал его для моей stm32f407.
я столкнулся с проблемой использования Atollic для ARM на STM32F4 (я думаю, это относится ко всем STM32 с FPU).
использование SW с плавающей точкой не сработало для меня (таким образом, компиляция правильно).
когда STM32cubeMX генерирует код для TrueStudio (Atollic), он не устанавливает блок FPU в настройках сборки C/C++ (не уверен в сгенерированном коде для других IDE).
установите FPU в "целевой" for (В разделе построение свойств проекта настройки):
- сборщик
- Компилятор C
- C Linker
тогда у вас есть выбор, чтобы смесь технического и программного обеспечения FP или использует HW.
сгенерированные командные строки добавляются с этим для намеченной цели:
-mfloat-abi=hard -mfpu=fpv4-sp-d16
я столкнулся с той же проблемой. Я пытался построить приложение linux для Cyclone V FPGA-SoC. Я столкнулся с проблемой, как показано ниже:
Error: <application_name> uses VFP register arguments, main.o does notя использовал инструментальную цепочку
arm-linux-gnueabihf-g++
обеспеченный врезанным инструментом проектирования программного обеспечения Альтера.он решается путем экспорта:
mfloat-abi=hard
флаги, потомarm-linux-gnueabihf-g++
компилируется без ошибок. Также включите флаги в обоихCC
&LD
.
в моем конкретном случае
-g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork
работали.
этот ответ может показаться на поверхности не связанным, но есть косвенная причина этого сообщения об ошибке.
во-первых, " использует регистр VFP..."сообщение об ошибке непосредственно вызвано смешиванием параметров mfloat-abi=soft и mfloat-abi=hard в вашей сборке. Этот параметр должен быть согласован для всех объектов, которые должны быть связаны. Этот факт хорошо освещен в других ответах на этот вопрос.
косвенная причина этой ошибки может быть связана с редактором Eclipse запутаться из-за ошибки, которую сам себе нанес в проекте ".cproject файл". Редактор Eclipse часто перезапускает ссылки на файлы, а иногда он ломается, когда вы вносите изменения в свои структуры каталогов или местоположения файлов. Это также может повлиять на настройки пути к компилятору gcc-и только для подмножества файлов вашего проекта. Хотя я еще не уверен, что именно вызывает этот сбой, заменив его .cproject файл с резервной копией исправила эту проблему для меня. В моем случае я отмеченный.Ява.ноль.ошибки указателя после добавления пути к каталогу include и начала получать сообщения" ошибка регистра VFP " из синего цвета. В журнале сборки я заметил, что для некоторых моих источников, которые были локальными для рабочей области, использовался другой путь к компилятору gcc, но не все из них!? Два компилятора gcc использовали разные настройки float по неизвестным причинам-следовательно, ошибка регистра VFP.
я сравнивал .настройки cproject с более старой копией и наблюдаемые различия в записях для источников, вызывающих проблемы-даже если переопределение параметров проекта было отключено. Путем замены .cproject файл со старой версией проблема ушла, и я оставлю этот ответ как напоминание о том, что произошло.