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, приведенная в начале.
Благодарю.