Qt 4.8 Кросс-компиляция для встраиваемых Linux-систем с использованием Linaro Toolchain из Windows

Я пытаюсь использовать бинарную версию Linaro Toolchain для Windows 2012.06 ( https://launchpad.net/linaro-toolchain-binaries/trunk/) для кросс-компиляции исходного кода Qt 4.8 для целевой платы со встроенной платформой Linux ARM Cortex-8., Я смог сделать это с помощью цепочки инструментов CodeSourcery, упомянутой в этом посте -> http://c2143.blogspot.com/?view=classic. Но программное обеспечение целевой платы было построено с помощью набора инструментов Linaro, и поэтому я работаю над этим.

Я исправил mkspec, упомянутый в посте выше, чтобы он выглядел так:

#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
include(../common/unix.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
include(../common/qws.conf)

MAKEFILE_GENERATOR      = MINGW
CONFIG                 += no_import_libs no_generated_target_info
# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++
QMAKE_LIB               = arm-linux-gnueabihf-ar
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_STRIP             = arm-linux-gnueabihf-strip
QMAKE_RUN_CC            = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CC_IMP        = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
QMAKE_RUN_CXX           = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
QMAKE_INCDIR            =
QMAKE_INCDIR_QT         = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT         = $$[QT_INSTALL_LIBS]
QMAKE_MOC               = $$[QT_INSTALL_BINS]\\moc.exe
QMAKE_UIC               = $$[QT_INSTALL_BINS]\\uic.exe
QMAKE_IDC               = $$[QT_INSTALL_BINS]\\idc.exe
QMAKE_COPY              = copy /y
QMAKE_COPY_DIR          = xcopy /s /q /y /i
QMAKE_MOVE              = move
QMAKE_DEL_FILE          = del
QMAKE_MKDIR             = mkdir
QMAKE_DEL_DIR           = rmdir
QMAKE_CHK_DIR_EXISTS    = if not exist
QMAKE_IDL               = midl
QMAKE_ZIP               = zip -r -9
CODESOURCERY_ARM_CFLAGS = -march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=vfp -mfloat-abi=softfp -Wa,-mimplicit-it=thumb -marm -mthumb-interwork
#modifications to gcc-base.conf
QMAKE_CFLAGS           += $$CODESOURCERY_ARM_CFLAGS
QMAKE_CXXFLAGS         += $$CODESOURCERY_ARM_CFLAGS
QMAKE_LIBS             += -lrt -lpthread -ldl
QMAKE_LFLAGS           += $${QMAKE_LFLAGS_RPATH}$$[QT_INSTALL_LIBS]
!isEmpty(TARGET_QTDIR) {
    QMAKE_LFLAGS       += $${QMAKE_LFLAGS_RPATH}$${TARGET_QTDIR}/lib
}
!isEmpty(TARGET_SYSROOT) {
    QMAKE_LFLAGS       += $${QMAKE_LFLAGS_RPATH}$${TARGET_SYSROOT}/lib:$${TARGET_SYSROOT}/usr/lib
    QMAKE_LFLAGS       += -Wl,--dynamic-linker=$${TARGET_SYSROOT}/lib/ld-linux.so.3
}
load(qt_config)

Когда я запускаю mingw32-make на Makefile верхнего уровня, чтобы создать библиотеки Qt для платы ARM, он некоторое время компилируется, но неизбежно выдает ошибки с:

collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [..\..\lib\libQtCore.so] Error 1
mingw32-make[1]: Leaving directory `C:/Users/user/Desktop/qt_creator_toolchain...
mingw32-make: *** [sub-corelib-make_default-ordered] Error 2

Эта ошибка возникает после многих жалоб, таких как:

*.so uses VFP register arguments, *obj does not

Я исследовал эту ошибку и попытался передать каждую из следующих опций моему mkespec и пересобрать с той же ошибкой:

-mfloat-abi=softfp
-mfloat-abi=soft
-mfloat-abi=hard

Я явно не понимаю, почему опция -mfloat-abi=softfp отлично работает с набором инструментов CodeSourcery для Windows, но не с Linaro. Остальные флаги компилятора показаны в mkspec выше.

У кого-нибудь есть понимание или мысли о том, как заставить это работать? Заранее спасибо.

ОБНОВИТЬ:

Оказывается, если я изменю свой C_FLAGS в mkspec из этого:

-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=vfp -mfloat-abi=softfp -Wa,-mimplicit-it=thumb -marm -mthumb-interwork

к этому:

-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=neon -mfloat-abi=hard -Wa,-mimplicit-it=thumb -marm -mthumb-interwork

Тогда я наконец смогу успешно скомпилировать Qt. Как это повлияет на мою производительность / или способность запускать приложение Qt на доске? Почему я не могу сделать softfp с Linaro, но я могу с CodeSourcery?

1 ответ

Решение

- Привет, phil999,
Руководство программиста серии Cortex-A Версия: 2.0
по http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013a/index.html

Из документа известно, что
-mfpu=vfp указывает, что у цели есть оборудование VFP. (Как и при указании опции -mfpu=neon.)
Итак, согласно вашему C_FLAGS, опция "-mfpu=vfp" приравнивается к опции "-mfpu=neon", разница в Linaro может заключаться между опцией "-mfloat-abi=softfp" и опцией "-mfloat-abi=hard",

Из предоставленных ошибок,

Эта ошибка возникает после многих жалоб, таких как: *.so использует аргументы регистра VFP, *obj - нет


похоже, что файлы lib скомпилированы с помощью -mfloat-abi = hard, который распознается как "использует аргументы регистра VFP".

Потому что, если опция "-mfloat-abi=softfp" используется для компиляции файлов lib, аргументы с плавающей точкой будут переданы в R0-R3 и в пространстве стека;
Опция "-mfloat-abi=hard" должна быть уточнена после передачи аргументов с плавающей точкой в ​​регистрах VFP или NEON.

Таким образом, для связи с этими файлами lib, скомпилированными с помощью "-mfloat-abi=hard", вы также должны скомпилировать QT с помощью "-mfloat-abi=hard", иначе могут возникнуть некоторые подобные жалобы, с которыми вы столкнулись.

Кроме того, из файла readme в gcc-linaro-arm-linux-gnueabihf-2012.06-20120625_win32\gcc-linaro-arm-linux-gnueabihf-2012.06-20120625_win32\share\doc\gcc-linaro-arm-linux-gnueabihf

Некоторые моменты в readme следующие

Целевая совместимость


Версия arm-linux-gnueabihf предназначена для версии Linaro Evaluation Build 12.05 Ubuntu 12.04 "Precise Pangolin". Конфигурация по умолчанию:

  • Работает на всех устройствах профиля Cortex-A
  • Настроен на Cortex-A9
  • Thumb-2
  • Соглашение о вызовах с жестким поплавком
  • Использует VFPv3-D16 FPU
  • Multiarch и multilib включены
  • EGLIBC 2.15
  • GCC 4.7 серии libgcc и libstdC++

Использовать softfp или hard

Два момента:
1. Использование float-abi с "softfp" обеспечивает обратную совместимость со старыми кодами ABI softfp.
2. с "-mfloat-abi=hard" это более эффективно, но не обеспечивает обратной совместимости с abi-кодами softfp.

Более подробную информацию можно найти в разделах "Поддержка 18.2 VFP в GCC" и "15.1.1 Использование регистра VFP и NEON" в Руководстве для программистов серии Cortex-A. Версия 2.0, приведенная в начале.

Благодарю.

Другие вопросы по тегам