Я кросс-компилирую проект для цели ARM Cortex-M4F. Я успешно кросс-компилировал этот проект в течение нескольких месяцев на ПК с Windows 7, и теперь я должен иметь возможность кросс-компилировать его также из среды Linux (работающей на виртуальной машине в среде Windows). Сборка выполняется с точно таким же переносимым Makefile, поэтому вызовы компилятора и компоновщика абсолютно одинаковы, за исключением путей.
Хотя в Windows все идет хорошо, у меня есть куча ошибок в Linux (Ubuntu 18.04), когда вызывается компоновщик (компиляция всех файлов идет хорошо):
/ usr / lib / gcc / arm-none-eabi / 6.3.1 /../../../ arm-none-eabi / bin / ld: ошибка: / usr / lib / gcc / arm- none-eabi / 6.3.1 /../../../ arm-none-eabi / lib / crt0.o: конфликтующие архитектуры ЦП 13/1
/ usr / lib / gcc / arm-none-eabi / 6.3.1 /../../../ arm-none-eabi / bin / ld: не удалось объединить конкретные данные файла / usr / Библиотека / GCC / рычажного ни-EABI / 6.3.1 /../../../ рычажного ни-EABI / Библиотека / crt0.o
myProgram.out использует аргументы регистра VFP, /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a -nano-vfprintf_i.o) не [И еще как ...]
Я прочитал вопрос и ответы Ошибка компиляции ARM, зарегистрированный VFP используется исполняемым файлом, а не объектным файлом , а также Как (перекрестно) скомпилировать как ARM, так и soft-float (softfp) с одним GCC (кросс-) компилятором? и хотя они действительно помогли понять одну часть проблемы, ни один из них не привел меня к решению.
В обеих ОС я использую arm-none-eabi-gcc V6.3.1:
Windows 7 64-битная
gcc версия 6.3.1 20170215 (выпуск) [ARM / Embedded-6-Branch Revision 245512] (Инструменты GNU для встроенных процессоров ARM 6-2017-q1-обновление)
Ubuntu 18.04
gcc версия 6.3.1 20170620 (15: 6.3.1 + svn253039-1build1)
И у обоих, похоже, одинаковые мультибиблиотеки:
Windows 7 64-битная
.;
большой палец; @mthumb
трудно; @ mfloat-аби = жесткий
палец / v6-м; @ mthumb @ марш = armv6s-м
большой палец / V7-м; @ mthumb @ марш = ARMv7-м
большой палец / v7e-м; @ mthumb @ марш = armv7e-м
большой палец / v7-ар; @ mthumb @ марш = ARMv7
большой палец / v8-m.base; @ mthumb @ марш = armv8-m.base
большой палец / v8-m.main; @ mthumb @ марш = armv8-m.main
палец / v7e м / fpv4-SP / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = softfp
палец / v7e м / fpv4-SP / жесткий; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = трудно
палец / v7e м / fpv5-SP / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv5-SP-D16 @ mfloat-ABI = softfp
палец / v7e м / fpv5-SP / жесткий; @ mthumb @ марш = armv7e-м @ МФП = fpv5-SP-D16 @ mfloat-ABI = трудно
палец / v7e м / fpv5 / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv5-D16 @ mfloat-ABI = softfp
большой палец / v7e м / fpv5 / жесткий; @ mthumb @ марш = armv7e м @ МФП = fpv5-d16 @ mfloat-аби = жесткий
палец / V7-ар / fpv3 / softfp; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-D16 @ mfloat-ABI = softfp
большой палец / v7-ар / fpv3 / жесткий; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-d16 @ mfloat-аби = жесткого
палец / v8-m.main / fpv5-SP / softfp; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-SP-D16 @ mfloat-ABI = softfp
большой палец / v8-m.main / fpv5-зр / жесткий; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-зр-d16 @ mfloat-аби = жесткий
палец / v8-m.main / fpv5 / softfp; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-D16 @ mfloat-ABI = softfp
большой палец / v8-m.main / fpv5 / жесткий; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-d16 @ mfloat-аби = жесткий
Ubuntu 18.04
.;
большой палец; @mthumb
трудно; @ mfloat-аби = жесткий
палец / v6-м; @ mthumb @ марш = armv6s-м
большой палец / V7-м; @ mthumb @ марш = ARMv7-м
большой палец / v7e-м; @ mthumb @ марш = armv7e-м
большой палец / v7-ар; @ mthumb @ марш = ARMv7
палец / v7e м / fpv4-SP / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = softfp
палец / v7e м / fpv4-SP / жесткий; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = трудно
палец / v7e м / fpv5 / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv5-D16 @ mfloat-ABI = softfp
большой палец / v7e м / fpv5 / жесткий; @ mthumb @ марш = armv7e м @ МФП = fpv5-d16 @ mfloat-аби = жесткийпалец / V7-ар / fpv3 / softfp; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-D16 @ mfloat-ABI = softfp
большой палец / v7-ар / fpv3 / жесткий; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-d16 @ mfloat-аби = жесткого
большой палец / v7-ар / fpv3 / жесткий / быть, @ mthumb @ марш = ARMv7 @ МФП = VFPv3-d16 @ mfloat-аби = жестким @ mbig-Endian
Из того, что я читал здесь и там, очень важно указать, хотим ли мы реализовать реализацию с плавающей или мягкой плавающей запятой. Я хочу использовать аппаратное обеспечение, поэтому каждый вызов gcc (компилятор сборки, компилятор C, компоновщик) имеет эти два флага:
-mfloat-abi = hard -mfpu = fpv4-sp-d16
Вот другие флаги компилятора:
-функция-разделы -fdata-секции -fno-строго-псевдонимы -fno-встроенные -short-enums -MP -MD
И флаги компоновщика:
-Xlinker -mthumb -mabi = aapcs -mcpu = cortex-m4 -lrdimon -u _printf_float --specs = nano.specs -lc -lnosys -Wl, - gc-section
Я просто не вижу здесь, что может быть причиной этих сообщений об ошибках, поскольку реализация указывается каждый раз. Единственная гипотеза, которую я имею, состоит в том, что некоторые библиотеки (например, lib_a-nano, которые мы видим в ошибке) созданы для мягкой реализации. Но, допустим, в этом проблема, как использовать ту же библиотеку, созданную для сложной реализации?