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
Vous devez vous connecter pour publier un commentaire.
-
Salut, phil999,
Cortex-Une Série Guide du Programmeur Version: 2.0
au http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013a/index.html
À partir du document, il est connu que
-mfpu=vfp indique que la cible a VFP matériel. (Comme le fait en spécifiant l'option-mfpu=néon.)
Donc, selon votre C_FLAGS, l'option "-mfpu=vfp" équivaut à l'option"-mfpu=neon",
la différence de Linaro peut se situer entre l'option "-mfloat-abi=softfp" et l'option "-mfloat-abi=dur".
Les erreurs fourni,
Cette erreur se produit après de nombreuses plaintes comme:
*.utilise donc VFP registre arguments, *obj n'est pas
il semble que la lib, les fichiers sont compilés avec l'option "-mfloat-abi=dur", qui est reconnue par "utilise VFP registre des arguments".
Parce que si l'option "-mfloat-abi=softfp" est utilisé pour compiler les fichiers lib, virgule flottante arguments seront passés dans R0 R3 et dans l'espace de pile;
L'Option "-mfloat-abi=dur" doit être spicified, une fois passé à virgule flottante arguments en VFP ou NÉON registres à virgule flottante.
Donc, afin de créer un lien avec ces fichiers lib compilé avec l'option "-mfloat-abi=dur", vous devez également compiler QT avec "-mfloat-abi=dur", ou, il y aura des plaintes semblables que vous avez rencontré.
En outre, à partir du fichier readme dans 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
Certains points dans le readme sont comme suit
Cible compatibilité
L'arm-linux-gnueabihf version cibles de la Linaro Évaluation de Construire
12.05 saveur de Ubuntu 12.04 "Precise Pangolin". La valeur par défaut
la configuration est:
À utiliser softfp ou dur
Deux points:
1. À l'aide du flotteur-abi avec "softfp", il est rétro-compatibilité avec les anciens softfp ABI codes.
2. avec "-mfloat-abi=dur", il est plus efficace, mais n'est pas de compatibilité descendante avec softfp abi codes.
Plus de détails se trouvent dans "18.2 VFP soutien dans GCC" et "15.1.1 VFP et NÉON registre d'utilisation" dans le Cortex-Une Série Guide du Programmeur Version: 2.0 répertoriés au début.
Grâce.
OriginalL'auteur shawn xy bai