Qt 4.8 Cross Compile for Embedded Linux using Linaro Toolchain from Windows
-
I am trying to use the 2012.06 version of the Linaro Toolchain Windows Binary ( https://launchpad.net/linaro-toolchain-binaries/trunk/ ) to cross-compile the Qt 4.8 source to target an embedded Linux ARM Cortex-8 board. I was able to do this with the CodeSourcery toolchain mentioned in this post --> http://c2143.blogspot.com/?view=classic. But the target board software was built with the Linaro toolchain and so I am working towards that end.
I have patched the mkspec mentioned in the post above to look like this:
@ #
# 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)@
When I run mingw32-make on the top level Makefile in order to produce the Qt libraries for the ARM board it compiles for a while but inevitably errors with:
@ 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@This error happens after many complaints like:
@
*.so uses VFP register arguments, *obj does not@I've researched that error and have tried to pass each of the following options to my mkespec and rebuild with the same error:
@ -mfloat-abi=softfp
-mfloat-abi=soft
-mfloat-abi=hard
@
I am clearly not understanding why the '-mfloat-abi=softfp' option works fine with the CodeSourcery Windows toolchain but not Linaro. The rest of the compiler flags are shown in the mkspec above.Does anybody have any insight or thoughts on how to make this work? Thanks in advance.
UPDATE:
It turns out if I modify my C_FLAGS in the mkspec from this:
@-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=vfp -mfloat-abi=softfp -Wa,-mimplicit-it=thumb -marm -mthumb-interwork@
to this:
@-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=neon -mfloat-abi=hard -Wa,-mimplicit-it=thumb -marm -mthumb-interwork@
Then I can finally successfully compile Qt. How will this affect my performance / or ability to run a Qt App on the Board? Why can't I do softfp with Linaro but I can with CodeSourcery?
-
Hi All,
We are trying to run a Qt application on Xilinx ZC-702 board(running linaro ubuntu desktop).
We have followed below mentioned steps, but GUI is not firing..
-
qt-everywhere-opensource-src-4.7.3.tar.gz(Extract It)
-
qmake.conf: either replace the qmake.conf in /home/user/qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-gnueabi-g++/qmake.onf Replace: arm-none-linux-gnueabi-gcc by arm-linux-gnueabihf-gcc
-
Set the path: export CROSS_COMPILE=arm-linux-gnueabihf- export PATH=/usr/bin:$PATH export ZYNQ_QT_BUILD=/home/user/qt-everywhere-opensource-src-4.7.3 export ZYNQ_QT_INSTALL=/usr/local/Trolltech export PATH=$ZYNQ_QT_INSTALL/bin:$PATH
-
./configure -embedded armv7l -xplatform qws/linux-arm-gnueabi-g++ -little-endian -opensource -host-little-endian -confirm-license -prefix $ZYNQ_QT_INSTALL -qt-zlib -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -no-openssl -no-nis -no-cups -iconv -no-pch -no-dbus -qt-freetype -no-opengl -qt-gfx-linuxfb -qt-gfx-vnc -qt-gfx-qvfb
-
make make -install copied the libraries to the target board.
-
./appname -qws -display QVFb:0 error: driver cannot connect Aborted
./appname -qws LinuxFb:mmwidth=1024:mmheight=768 this dsnt give any error but, its not launching the GUI but printing the log messages in terminal.
can you tell What steps are missing here?
-
-
Hi,
qfvb is used on your host computer for when you want to test your application's GUI without a board (using i.e. an x86 QtEmbbeded)
What does it print on your terminal ?
-
Hi,
On x86 its working fine. We are getting the issues when we are trying to run the same application on target Board, for which i am using LinuxFb only.
So could you suggest what step we are missing in order to compile the QT for target.
When we are runnign the application on target I am getting the printf messages or qDebug messages in terminal but not able to fireup the GUI.