Unsolved Cross-compiling QT5.7 for linux ARM setting linker path
-
Hello QT community,
This is my first post here, I hope I will get the answers I need !! I have been struggling for a week , trying to compile QT for an ARM device ( based on AM335 ) just like the beaglebone.
I ran across all the qmake.conf files and its includes friends. I am still not ble to find a way to include the proper directory into my build.
The compilation works fine with my toolchain, when it gets to the linker part it can't find : ld-linux.so.3:"/media/projects/myfolder/toolchain/arm-cortex_a8-linux-gnueabi/bin/../lib/gcc/arm-cortex_a8-linux-gnueabi/4.9.1/../../../../arm-cortex_a8-linux-gnueabi/bin/ld: cannot find /lib/ld-linux.so.3: No such file or directory collect2: error: ld returned 1 exit status make: *** [../bin/qmake] Error 1 Error configuring Qt!"
Here is the command used by the linker
arm-cortex_a8-linux-gnueabi-g++ -o "../bin/qmake" project.o option.o property.o main.o ioutils.o proitems.o qmakevfs.o qmakeglobals.o qmakeparser.o qmakeevaluator.o qmakebuiltins.o makefile.o unixmake2.o unixmake.o mingw_make.o winmakefile.o projectgenerator.o meta.o makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o msvc_vcproj.o msvc_vcxproj.o msvc_nmake.o msvc_objectmodel.o msbuild_objectmodel.o cesdkhandler.o qtextcodec.o qutfcodec.o qstring.o qstring_compat.o qstringbuilder.o qtextstream.o qiodevice.o qringbuffer.o qdebug.o qmalloc.o qglobal.o qarraydata.o qbytearray.o qbytearraymatcher.o qdatastream.o qbuffer.o qlist.o qfiledevice.o qfile.o qfilesystementry.o qfilesystemengine.o qfsfileengine.o qfsfileengine_iterator.o qregexp.o qvector.o qbitarray.o qdir.o qdiriterator.o quuid.o qhash.o qfileinfo.o qdatetime.o qstringlist.o qabstractfileengine.o qtemporaryfile.o qmap.o qmetatype.o qsettings.o qsystemerror.o qlibraryinfo.o qvariant.o qvsnprintf.o qlocale.o qlocale_tools.o qlinkedlist.o qnumeric.o qcryptographichash.o qxmlstream.o qxmlutils.o qlogging.o qjson.o qjsondocument.o qjsonparser.o qjsonarray.o qjsonobject.o qjsonvalue.o qfilesystemengine_unix.o qfilesystemiterator_unix.o qfsfileengine_unix.o qlocale_unix.o -Wl,-rpath-link,/media/projects/myfolder/toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot/usr/lib/ -Wl,-rpath-link,/media/projects/myfolder/toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot/lib/ -Wl,-rpath-link,/media/projects/myfolder/toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot/ -Wl,-rpath-link,$[QT_SYSROOT]/usr/lib/ -Wl,-rpath-link,$[QT_SYSROOT]/lib/ -mfloat-abi=hard -mfloat-abi=softfp -Wl,--gc-sections
My qmake.conf :
# # qmake configuration for the our project # include(../common/linux_device_pre.conf) QT_SYSROOT =/media/projects/myproject/toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot #Compile and link flags QMAKE_CFLAGS = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp QMAKE_CXXFLAGS = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #QMAKE_LFLAGS += -v -Wl,-rpath-link,/media/projectsmyproject/toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot/lib -Wl,-rpath-link,/media/projects/myproject/toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot/usr/lib QMAKE_LFLAGS += -Wl,-rpath-link,$${QT_SYSROOT}/usr/lib/$${GCC_MACHINE_DUMP} \ -Wl,-rpath-link,$${QT_SYSROOT}/lib/$${GCC_MACHINE_DUMP} \ -Wl,-rpath-link,$${QT_SYSROOT}/$${GCC_MACHINE_DUMP} #Modification to linux_device_pre that came from g++-unix.conf QMAKE_CC = arm-cortex_a8-linux-gnueabi-gcc QMAKE_CXX = arm-cortex_a8-linux-gnueabi-g++ QMAKE_LINK = arm-cortex_a8-linux-gnueabi-g++ QMAKE_LINK_SHLIB = arm-cortex_a8-linux-gnueabi-g++ QMAKE_AR = arm-cortex_a8-linux-gnueabi-ar cqs QMAKE_OBJCOPY = arm-cortex_a8-linux-gnueabi-objcopy QMAKE_STRIP = arm-cortex_a8-linux-gnueabi-strip QMAKE_NM = arm-cortex_a8-linux-gnueabi-nm -P QMAKE_INCDIR = /opt/tslib/include/ QMAKE_LIBDIR = /opt/tslib/lib/ QMAKE_RPATHDIR += /opt/tslib/lib # Extra stuff (OpenGL, DirectFB, ...) QMAKE_INCDIR_EGL = QMAKE_LIBDIR_EGL = QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL} QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL} QMAKE_INCDIR_OPENVG = $${QMAKE_INCDIR_EGL} QMAKE_LIBDIR_OPENVG = $${QMAKE_LIBDIR_EGL} QMAKE_LIBS_EGL = -lEGL -lIMGegl -lsrv_um QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL} QMAKE_LIBS_OPENVG = -lOpenVG $${QMAKE_LIBS_EGL} # No need for any special EGL device integration. # Prioritize the default, compiled-in integration over any plugins. EGLFS_DEVICE_INTEGRATION = none include(../common/linux_arm_device_post.conf) load(qt_config)
Even after telling it to look in my toolchain folder, ld seems to look into the /lib/ folder anyway.
Any chance someone ran into this problem before ??? ( p.s. ) my folder /lib/ in the toolchain contain the actual file that I need.
-
Hi and welcome to devnet,
What options are you passing to your configure call ?
Note that if your device is like a BBB, you should use the BBB mkspec as a base for yours and pass the proper information to configure.
-
BASE_DIR=$(pwd) TOOLCHAIN_DIR=$BASE_DIR/../toolchain/arm-cortex_a8-linux-gnueabi HOST_TYPE=arm-cortex_a8-linux-gnueabi SYSROOT_DIR=$BASE_DIR/../toolchain/arm-cortex_a8-linux-gnueabi/arm-cortex_a8-linux-gnueabi/sysroot TARGET_DIR=$BASE_DIR/../buildroot/board/tornatech/filesystem/opt PREFIX='qt-embedded' EXTPREFIX=$TARGET_DIR/$PREFIX CONFIGURE_CMD="./configure -v -xplatform linux-arm-gnueabi-g++ -device linux-brio-tor019-++ -sysroot $SYSROOT_DIR -extprefix $EXTPREFIX -device-option COSS_COMPILE=$TOOLCHAIN_DIR/bin/$HOST_TYPE- -make libs -confirm-license -release -opensource -force-pkg-config -no-icu -no-dbus -no-xcb -no-gif -no-xkbcommon-evdev -no-evdev -tslib -no-mtdev -qt-libjpeg -qt-zlib -no-harfbuzz -no-libproxy -no-xinput2 -no-xcb-xlib -no-pulseaudio -no-alsa -no-largefile -no-iconv -no-pch -no-sse2 -no-glib -no-cups -rpath "
The "device" stated here exist, that's the name of our folder containing the qmake file. My example for the qconf ( in mkspec ) was the beagleboard, the file is almost identical to the beagleboard one, except for the soft floating point
-
Actually, I have to revise my question.
qmake is able to be built, but at the runtime when I try to launch the QT compilation, it ask for/lib/ld-linux.so.3: No such file or directory
-
-
This post is deleted! -
@jsulm
It says :not a dynamic executable
I guess I am missing a flag or something at compile time, I tried a lot of combinaison for including my "fakeroot" folder. I tought that it was the point of having --sysroot in the configure script
-
What do you get if your call
file qmake
? -
@SGaist - Thanks for your quick reply
qmake: ERROR: cannot open `qmake' (No such file or directory)
I am still looking for a "missing flag" in the conf file ... is there anywhere else I should look ?
I just had a tought,
I want to cross-compile QT to have the libraries on my embedded platform. Am I doing this wrong by building qmake with the cross-compiler app ?
since qmake is used to build the makefile for QT, I have to run it on my host system right ? So, that being said, do I need to have qmake cross-compiled ? sor sure it won't work on my systemmy reference was :
Building Qt for Embedded Linux
but it says that this is obsolete and it's only good for QT4, I bet this is good for QT5 as well ??( This is my first time compiling QT )
-
Ok... When someone suggest to call
ldd
on a file, you are supposed to give the full path that file or change your current folder to where that file is otherwise the command won't work. The same forfile
.As for your qmake.conf i'd remove the
QT_SYSROOT
assignment, it should be done for you through the configure script and the parameters you give it.qmake is a host tool that is not cross-compiled.
-
The file and ldd worked, but the binary was a arm compiled binary, that's why it wasn't working. May I suggest updating the http://wiki.qt.io/Building_Qt_for_Embedded_Linux#The_Host_Build to specify that it's still the actual way to to it, even in qt5
@SGaist said in Cross-compiling QT5.7 for linux ARM setting linker path:
qmake is a host tool that is not cross-compiled.
I figured that out today !! I am still wondering why it is trying to compile qmake with the cross compiler when I make the second configure ( the one with the option -device CROSSC_COMPILE= ....
-
Are you doing your second call to configure in a clean state ?
-
The article you mention is really specific to Qt 4. So no, it should not be modified. There's even a link at the top for Qt 5.