Qt 4.8 Cross-Kompilieren für Embedded Linux mit Linaro Toolchain von Windows
Ich versuche, mit der 2012.06 version der Linaro Toolchain Windows-Binary ( https://launchpad.net/linaro-toolchain-binaries/trunk/ ), um cross-kompilieren der Qt 4.8 Quelle zum Ziel ein embedded-Linux-ARM-Cortex-8-Brett. Ich war in der Lage, dies zu tun mit der CodeSourcery toolchain erwähnt in diesem Beitrag --> http://c2143.blogspot.com/?view=classic. Aber die target-board-software wurde mit der Linaro toolchain und so arbeite ich hin, Ende.
Ich geflickt habe die mkspec erwähnt in dem post oben so Aussehen:
#
# 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)
Wenn ich mingw32-make auf dem top-level-Makefile, um die Qt-Bibliotheken für die ARM-board kompiliert für eine Weile, aber zwangsläufig Fehler mit:
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
Dieser Fehler passiert, nach vielen Beschwerden, wie:
*.so uses VFP register arguments, *obj does not
Habe ich recherchiert, dass Fehler und versucht, in jedem Durchgang der folgenden Optionen, um meine mkespec und neu erstellen mit dem gleichen Fehler:
-mfloat-abi=softfp
-mfloat-abi=soft
-mfloat-abi=hard
Bin ich eindeutig nicht verstehen, warum die '-mfloat-abi=softfp " - option funktioniert gut mit der CodeSourcery Windows-toolchain aber nicht Linaro. Der rest des compiler-flags sind in der mkspec oben.
Hat jemand eine Einsicht oder Gedanken auf, wie diese Arbeit zu machen? Vielen Dank im Voraus.
UPDATE:
Es stellt sich heraus, wenn ich ändern Sie meine C_FLAGS in der mkspec aus:
-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
Dann kann ich endlich erfolgreich zu kompilieren Qt. Wie wird sich dies auf meine Leistung /oder die Fähigkeit zum ausführen einer Qt-App auf dem Board? Warum kann ich das nicht softfp mit Linaro, aber ich kann mit CodeSourcery?
InformationsquelleAutor PhilBot | 2012-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
-
Hi, phil999,
Cortex-A-Series Programmer ' s Guide Version: 2.0
bei http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013a/index.html
Aus dem Dokument, es ist bekannt, dass
-mfpu=vfp-gibt an, dass das Ziel hat, VFP-hardware. (Wie funktioniert die Angabe der option -mfpu=neon -.)
So, nach Ihren C_FLAGS, option "-mfpu=vfp - "entspricht mit der option"-mfpu=neon",
der Unterschied in Linaro liegen kann zwischen der option "-mfloat-abi=softfp" und der option "-mfloat-abi=hard".
Aus den Fehlern zur Verfügung gestellt,
Dieser Fehler passiert, nach vielen Beschwerden, wie:
*.so verwendet VFP register arguments, *obj nicht
es scheint, dass die lib-Dateien sind kompiliert mit "-mfloat-abi=hard", das von ihm erkannt wird "verwendet VFP register arguments".
'Verursachen, wenn die option "-mfloat-abi=softfp" wird verwendet zum kompilieren der lib-Dateien, floating-point-Argumente übergeben werden, die in R0-R3 und im Stapelspeicher;
Die Option "-mfloat-abi=hard" muss spicified einmal vorbei floating-point-Argumente in VFP oder NEON-floating-point-Register.
So, in Reihenfolge zu verknüpfen, mit denen die lib-Dateien kompiliert mit "-mfloat-abi=hard", sollten Sie auch kompilieren Sie QT mit "-mfloat-abi=hard", oder wird es einige ähnliche Beschwerden wie du begegnet.
Außerdem aus der readme-Datei in 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
Einige Punkte in der readme-Datei sind wie folgt
Ziel-Kompatibilität
Den arm-linux-gnueabihf-version Zielen die Linaro-Auswertung Erstellen
12.05 Geschmack von Ubuntu 12.04 "Precise Pangolin". Der Standard
Konfiguration:
Zu verwenden softfp oder schwer
Zwei Punkte:
1. Mit float-abi mit "softfp", es ist die Abwärtskompatibilität mit älteren softfp ABI-codes.
2. mit "-mfloat-abi=hard", es ist effizienter, aber nicht rückwärts-Kompatibilität mit softfp abi-codes.
Mehr Einzelheiten finden Sie in "18.2 VFP-Unterstützung des GCC" und "15.1.1 VFP und NEON register-Ausnutzung" in der Cortex-A-Series Programmer ' s Guide Version: 2.0 am Anfang aufgeführten.
Dank.
InformationsquelleAutor shawn xy bai