Qt 4.8 Cross Compiler pour Linux Embarqué à l'aide de Linaro Chaîne d'outils de Windows

Je suis en train d'utiliser le 2012.06 version de la Linaro de la Chaîne Binaire Windows ( https://launchpad.net/linaro-toolchain-binaries/trunk/ ) pour cross-compiler Qt 4.8 source à la cible sur un Linux embarqué ARM Cortex-8 conseil d'administration. J'ai été capable de le faire avec le CodeSourcery de la chaîne d'mentionné dans ce post --> http://c2143.blogspot.com/?view=classic. Mais le conseil de la société cible logiciel a été construit avec l'Linaro de la chaîne et donc je suis en train de travailler à cette fin.

Je l'ai patché le mkspec mentionné dans le post ci-dessus pour ressembler à ceci:

#
# 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)

Quand je lance mingw32-make sur le haut niveau Makefile afin de produire les bibliothèques Qt pour le BRAS, elle compile, mais inévitablement des erreurs avec:

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

Cette erreur se produit après de nombreuses plaintes comme:

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

J'ai recherché cette erreur et ont essayé de passer chacune des options suivantes pour mon mkespec et reconstruire avec le même message d'erreur:

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

Je suis clairement pas comprendre pourquoi le "- mfloat-abi=softfp' option fonctionne très bien avec le CodeSourcery Windows de la chaîne, mais pas Linaro. Le reste des drapeaux de compilation sont affichés dans la mkspec ci-dessus.

Quelqu'un at-il n'importe quelle analyse ou de réflexion sur la façon de faire ce travail? Merci à l'avance.

Mise à JOUR:

Il s'avère que si je modifie mon C_FLAGS dans le mkspec de:

-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

Alors je peux enfin réussi à compiler Qt. Comment cela affectera ma performance /ou de la capacité à exécuter une Application Qt sur la Carte? Pourquoi ne puis-je pas faire softfp avec Linaro, mais je peux avec CodeSourcery?

OriginalL'auteur PhilBot | 2012-07-16