Ошибка компиляции 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 54

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

armatollic

я столкнулся с той же проблемой. Я пытался построить приложение 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 файл со старой версией проблема ушла, и я оставлю этот ответ как напоминание о том, что произошло.