Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Installation and Deployment
  4. Cross-compiling to ARM with QtCreator 5.x on Windows
Forum Updated to NodeBB v4.3 + New Features

Cross-compiling to ARM with QtCreator 5.x on Windows

Scheduled Pinned Locked Moved Unsolved Installation and Deployment
19 Posts 6 Posters 21.0k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Leonardo
    wrote on last edited by
    #2

    Yes, it is. The best approach I could find was to compile Qt using the msys2 environment in association with the right cross compiler for the target platform. You should use the configure script not the bat file. After compiling, just add this new build manually to Qt Creator and it's done.

    Here's an example of a configuration I have for an ARM Linux:

    ./configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -prefix C:/Qt/5.5/arm -no-icu -plugin-sql-sqlite -nomake examples -no-compile-examples -nomake tests -openssl -release -v -qreal float -skip qtwebkit -qt-zlib -skip translations -eglfs -shared -force-debug-info -opengl

    Some libraries might be missing on the host machine. In that case, you should copy them from the target system to your computer and add their paths to the command line above. For example:

    -L C:/sysroot/usr/lib -L C:/sysroot/usr/local/lib

    J 1 Reply Last reply
    1
    • L Leonardo

      Yes, it is. The best approach I could find was to compile Qt using the msys2 environment in association with the right cross compiler for the target platform. You should use the configure script not the bat file. After compiling, just add this new build manually to Qt Creator and it's done.

      Here's an example of a configuration I have for an ARM Linux:

      ./configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -prefix C:/Qt/5.5/arm -no-icu -plugin-sql-sqlite -nomake examples -no-compile-examples -nomake tests -openssl -release -v -qreal float -skip qtwebkit -qt-zlib -skip translations -eglfs -shared -force-debug-info -opengl

      Some libraries might be missing on the host machine. In that case, you should copy them from the target system to your computer and add their paths to the command line above. For example:

      -L C:/sysroot/usr/lib -L C:/sysroot/usr/local/lib

      J Offline
      J Offline
      JaffaMicrobrain
      wrote on last edited by JaffaMicrobrain
      #3

      @Leonardo Thank you for your reply Leonardo. Sorry, but I'm afraid that a lot of it went over my head.

      If I understand correctly, the only way is to compile QtCreator from source on the host (Windows 7) system?

      Since my Pi-2 had Qt 5.3.2 working, I downloaded "qt-opensource-windows-x86-android-5.3.2.exe" from Qt. I thought that since this Qt/Windows install already had support for ARM-7, it would only require a cross-compiler installing and configuring, such as Yagarto or GCC ARM. Is this completely naive of me?

      If I attempt your approach, then what compiler do you think I should I use on the host? Visual Studio Express? MIN GW?

      Thank you.

      1 Reply Last reply
      0
      • L Offline
        L Offline
        Leonardo
        wrote on last edited by
        #4

        Qt and QtCreator are different. QtCreator is the IDE. Qt is the set of tools and libraries, the framework. Qt has components that should run on the host machine (qmake, moc, etc) and components that should run on the target machine (libraries mostly).

        You can see on the configuration line above that we have two parameters: -platform and -xplaform. The former specifies the host machine, and the latter the target machine. You can't use the android build for raspberry. Both are ARM, but that's all. Other than that, they have few things in common.

        So you already have QtCreator for Windows. It's the same whatever system you're targeting. You only need to compile Qt. First of all, you need a cross compiler. I have no experience with Raspberry Pi, but I would say this one should do it:

        http://gnutoolchains.com/raspberry/

        Add it to your PATH. For the host you can use either mingw or visual studio. It's up to you. After that try to compile Qt using the msys2 environment.

        ./configure -platform win32-g++ -xplatform linux-arm-gnueabihf-g++ -device linux-rasp-pi2-g++ ...

        -device should account for board specific settings. Qt has no mkspec for "linux-arm-gnueabihf-g++". Just duplicate the "linux-arm-gnueabi-g++" one and add the "hf" everywhere.

        Indeed there are very few resources out there about Qt and cross compiling for Windows. It took me quite some time to understand it. Maybe you should get more familiar with the usual Qt compilation process first and only then try cross compiling.

        J 1 Reply Last reply
        1
        • L Leonardo

          Qt and QtCreator are different. QtCreator is the IDE. Qt is the set of tools and libraries, the framework. Qt has components that should run on the host machine (qmake, moc, etc) and components that should run on the target machine (libraries mostly).

          You can see on the configuration line above that we have two parameters: -platform and -xplaform. The former specifies the host machine, and the latter the target machine. You can't use the android build for raspberry. Both are ARM, but that's all. Other than that, they have few things in common.

          So you already have QtCreator for Windows. It's the same whatever system you're targeting. You only need to compile Qt. First of all, you need a cross compiler. I have no experience with Raspberry Pi, but I would say this one should do it:

          http://gnutoolchains.com/raspberry/

          Add it to your PATH. For the host you can use either mingw or visual studio. It's up to you. After that try to compile Qt using the msys2 environment.

          ./configure -platform win32-g++ -xplatform linux-arm-gnueabihf-g++ -device linux-rasp-pi2-g++ ...

          -device should account for board specific settings. Qt has no mkspec for "linux-arm-gnueabihf-g++". Just duplicate the "linux-arm-gnueabi-g++" one and add the "hf" everywhere.

          Indeed there are very few resources out there about Qt and cross compiling for Windows. It took me quite some time to understand it. Maybe you should get more familiar with the usual Qt compilation process first and only then try cross compiling.

          J Offline
          J Offline
          JaffaMicrobrain
          wrote on last edited by
          #5

          @Leonardo When you explained that I cannot use Qt ARM for Raspberry Pi a light was turned on at the end of the tunnel. Of course it isn't and I see that now.

          I have done some background reading and now believe that I have a better understanding, although there are still some gaps.

          So, I need Qt creator on the development host (Windows). This can be downloaded.

          I still don't quit understand where the MSYS2 comes in. I understand that this is a "Linux" type environment that runs on top of Windows. I understand that this will provide the minimum directory structure for compiling Qt.

          Assuming I compile the Qt development libraries, does this remain in MSYS2 or is it moved into the C:\Qt directory?

          Are you saying that I have to cross-compile Qt for the Raspberry Pi-2?

          I just don't understand what Qt I need to compile where.

          Sorry to be a pain. I promise to share this information once I get there.

          1 Reply Last reply
          0
          • L Offline
            L Offline
            Leonardo
            wrote on last edited by
            #6

            Hi. I recommend the msys2 environment because the "configure.bat" that is used on Windows doesn't know how to compile to any target other than Windows. Therefore we need to use the "configure" shell script, that's used on Linux. msys2 was the best tool capable of running it that I could find for this purpose. It's also integrated with the mingw-w64 compiler, so you just need to get a cross compiler and you have all you need.

            You need to cross-compile Qt's source code. See here:

            http://download.qt.io/official_releases/qt/5.5/5.5.1/single/

            1 Reply Last reply
            2
            • J Offline
              J Offline
              JaffaMicrobrain
              wrote on last edited by JaffaMicrobrain
              #7

              No success. I have managed to overcome a number of issues, but I am stuck with the current problem and I am not sure if my overall approach is correct?

              I started with a virgin install of Windows 7 (service pack 1) 64-bit, with all updates performed. This is hosted on a 4GHz Intel i7 system with 16GB RAM and 1TB 7200RPM hard drive.

              Qt Creator
              Qt Creator 5.5.1 was downloaded, installed and a trivial project completed to test the install. It is running 32-bit because I opted for the MINGW version.

              http://www.qt.io/download-open-source/#section-2

              qt-opensource-windows-x86-mingw492-5.5.1.exe

              MSYS2
              MSYS2 was downloaded and installed. I chose 64-bit since I am using Windows 7 64-bit.

              http://sourceforge.net/p/msys2/wiki/MSYS2 installation/

              msys2-x86_64-20150916.exe

              Raspberry Pi Toolchain
              Just as you recommended I downloaded and installed the toolchain for Raspberry Pi.

              http://gnutoolchains.com/raspberry/

              raspberry-gcc-4.9.2.exe

              I made sure that the PATH environment variable was set and checked that “arm-linux-gnueabihf-g++” was executable within MSYS2.

              Qt 5.5.1
              Then I downloaded the Qt 5.5.1 source. Since I was using Windows 7 I downloaded the ZIP version and used 7Zip to extract the files. These were extracted to C:\qtsource being a name consisting of simple ASCII characters.

              http://download.qt.io/official_releases/qt/5.5/5.5.1/single/

              qt-everywhere-opensource-src-5.5.1.zip

              I then navigated to C:\qtsource\qtbase\mkspecs and copied the \linux-arm-gnueabi-g++ directory to \linux-arm-gnueabihf-g++. I then edited the qmake.conf file to add “hf” (hard float) to all the named files. On checking with the Raspberry Pi toolchain I noticed that the executables within C:\SysGCC\Raspberry\bin used the name format “arm-linux-gnueabihf-” so I renamed the named files to this name format. Eg:

              QMAKE_CC = arm-linux-gnueabihf-gcc

              Configure
              So now time to configure and make. I launched a MSYS2 Shell and copied a modified version of your example ./configure command line in. At first I encountered an (e=2) file not found error. After a lot of scratching around I realised that the g++ was not being found. In the Raspberry Pi toolchain bin directory I copied arm-linux-gnueabihf-g++.exe to g++.exe and tried again.

              This time there was credible activity, but terminated with:

              In file included from C:/qtsource/qtbase/qmake/generators/makefiledeps.cpp:40:0:
              C:/qtsource/qtbase/mkspecs/win32-g++/qplatformdefs.h:47:19: fatal error: tchar.h: No such file or directory
              #include <tchar.h>
              ^
              compilation terminated.
              make: *** [makefiledeps.o] Error 1

              1 Reply Last reply
              0
              • L Offline
                L Offline
                Leonardo
                wrote on last edited by
                #8

                You're almost there! It's just that the last step is wrong. You should not have copied arm-linux-gnueabihf-g++.exe to g++.exe . As I said before, some tools are build for Windows and the libraries are build for Linux. Therefore, we need two compilers. If g++ is missing, it means that you're missing MinGW-w64 in your msys2 environment. First of all, check whether you have a shortcut named "MinGW-w64 Win64 Shell" in your start menu. If you do, that's the one you should be using. If you don't, you should install the package:

                pacman -S mingw-w64-x86_64-gcc

                1 Reply Last reply
                1
                • J Offline
                  J Offline
                  JaffaMicrobrain
                  wrote on last edited by
                  #9

                  Ah!

                  So the Raspberry Pi toolchain is used by QtCreator to build my projects for deployment on the Raspberry Pi device, whereas MinGW is used to build the Qt library for use within QtCreator on Windows?

                  In which case don't I need the MinGW-32 compiler environment, since I am using QtCreator MinGW 32-bit?

                  I deleted the g++.exe as you suggested and installed the MinGW-64 package into MSYS2. There was encouraging extivity but again it failed with:

                  C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: project.o: Relocations in generic ELF (EM: 40)
                  project.o: error adding symbols: File in wrong format
                  collect2.exe: error: ld returned 1 exit status
                  make: *** [../bin/qmake.exe] Error 1

                  1 Reply Last reply
                  0
                  • L Offline
                    L Offline
                    Leonardo
                    wrote on last edited by
                    #10

                    I don't get what you said about the compilers, but forget it for now.

                    It seems like you have a dirty source tree. That's why you get that error. Delete your "qtsource" directory and extract the zip file again.

                    1 Reply Last reply
                    0
                    • J Offline
                      J Offline
                      JaffaMicrobrain
                      wrote on last edited by
                      #11

                      Thank you.

                      So, I deleted the existing C:\qtsource and unpacked a new one. I then duplicated the \linux-arm-gnueabi-g++ directory to \linux-arm-gnueabihf-g++. Then I edited the qmake.conf to add "hf" to the file names.

                      I then removed MSYS2 and reinstalled. I used the command you suggested to install MinGW64. I also used the command pacman -S diffutils as I had been getting the error "cmp: Command not found".

                      I then run the configure statement:

                      ./configure -platform win32-g++ -xplatform linux-arm-gnueabihf-g++ -device linux-rasp-pi2-g++ -prefix C:/Qt/5.5.1/5.5/linux-rasp-pi2 -no-icu -nomake examples -no-compile-examples -nomake tests -openssl -release -v -qreal float -skip qtwebkit -qt-zlib -skip translations -eglfs -shared -force-debug-info -opengl

                      There was a lot of activity this time ending in the following error:

                      Running configuration tests...
                      Failed to process makespec for platform 'devices/linux-rasp-pi2-g++'
                      Project ERROR: CROSS_COMPILE needs to be set via -device-option CROSS_COMPILE=<p ath>
                      Could not read qmake configuration file C:/qtsource/qtbase/mkspecs/devices/linux -rasp-pi2-g++/qmake.conf.
                      Error processing project file: C:\msys64\tmp\empty-file

                      1 Reply Last reply
                      0
                      • L Offline
                        L Offline
                        Leonardo
                        wrote on last edited by
                        #12

                        It's getting better. I've never used the "-device" parameter before, actually. Try something like this:

                        ./configure -platform win32-g++ -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf-

                        By the way, you can build it outside the source tree, so you don't need to delete it every time. Create a folder like C:\qtbuild and call the configure script from it.

                        /c/qtbuild> ../qtsource/configure -platform.....

                        1 Reply Last reply
                        1
                        • J Offline
                          J Offline
                          JaffaMicrobrain
                          wrote on last edited by
                          #13

                          Thanks for the tip building outside the source tree.

                          Things seem to be going backwards now. I have this tchar.h: No such file or directory error back. I am using a clean C:\qtsource and C:\qtbuild. I have been struggling with this for about an hour.

                          I checked and there is a device definition for "linux-rasp-pi2-g++" in C:\qtsource\qtbase\mkspecs\devices.

                          The configure statement is this:

                          ../qtsource/configure -platform win32-g++ -xplatform linux-arm-gnueabihf-g++ -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -prefix C:/Qt/5.5.1/5.5/linux-rasp-pi2 -no-icu -nomake examples -no-compile-examples -nomake tests -openssl -release -v -qreal float -skip qtwebkit -qt-zlib -skip translations -eglfs -shared -force-debug-info -opengl

                          This is the resulting error:

                          C:/qtsource/qtbase/mkspecs/win32-g++/qplatformdefs.h:47:19: fatal error: tchar.h: No such file or directory
                          #include <tchar.h>
                          ^
                          compilation terminated.
                          make: *** [makefiledeps.o] Error 1

                          1 Reply Last reply
                          0
                          • L Offline
                            L Offline
                            Leonardo
                            wrote on last edited by
                            #14

                            Oh, I'm sorry. My mistake. You need the whole toolchain. The command line I've posted before was only for gcc. Here:

                            pacman -S mingw-w64-x86_64-toolchain

                            By the way, now you should remove the -xplatform parameter, as you're using CROSS_COMPILE.

                            Don't forget to clear your qtbuild folder, just to be sure.

                            1 Reply Last reply
                            0
                            • J Offline
                              J Offline
                              JaffaMicrobrain
                              wrote on last edited by JaffaMicrobrain
                              #15

                              Hi Leonardo. Sorry, I am still getting the same error:

                              In file included from C:/qtsource/qtbase/qmake/generators/makefiledeps.cpp:40:0:
                              C:/qtsource/qtbase/mkspecs/win32-g++/qplatformdefs.h:47:19: fatal error: tchar.h: No such file or directory
                              #include <tchar.h>
                              ^
                              compilation terminated.
                              make: *** [makefiledeps.o] Error 1

                              I am using this configure statement with -xcompile omitted:

                              ../qtsource/configure -platform win32-g++ -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -prefix C:/Qt/5.5.1/5.5/linux-rasp-pi2 -no-icu -nomake examples -no-compile-examples -nomake tests -openssl -release -v -qreal float -skip qtwebkit -qt-zlib -skip translations -eglfs -shared -force-debug-info -opengl

                              I installed "all" packages using the pacman command that you suggested. I also deleted and create a new C:\qtbuild directory.

                              Edit #1

                              I did some digging around and can confirm that tchar.h is located in:

                              C:\msys64\mingw64\x86_64-w64-mingw32\include

                              Edit #2

                              After reading more Qt documentation (why don't they date their documentation?), I suspect that this latest error is arising from not having and specifying a SYSROOT. I could be wrong of course. Am I required to have a Raspberry Pi image available on the Windows 7 platform to provide this sysroot? It seems to be a step taken in the instructions for cross-compiling Qt for RaspberryPi2 from Ubuntu.

                              I also struggle with is the role of the two toolchains here. There is the MinGW64 hosted within MSYS2. There is also the Win64 toolchain for Raspberry Pi downloaded from SysProgs.

                              Help!

                              1 Reply Last reply
                              0
                              • Bingo5B Offline
                                Bingo5B Offline
                                Bingo5
                                wrote on last edited by
                                #16

                                Hi JaffaMicroBrain.

                                I have the same problem.
                                I try to croos compile from windows and it seems that the file tchar.h is missing.
                                I've followed this tuto http://visualgdb.com/tutorials/raspberry/qt/embedded/
                                but still having the same problem.
                                Have you found any solutions to this ?

                                Regards,

                                1 Reply Last reply
                                0
                                • M Offline
                                  M Offline
                                  MikePelton
                                  wrote on last edited by
                                  #17

                                  After quite some hours of "fun" I managed to get the (excellent) set of instructions at:

                                  http://visualgdb.com/tutorials/raspberry/qt/embedded/

                                  to work on Windows 10. The trick was to start with a completely clean version of Raspbian, and then to install QT 5.5:

                                  sudo apt-get install qt5-default

                                  Note that I didn't also install Qt Creator on the PI.

                                  If you then follow the instructions to the letter, all will be well.

                                  I found the UpdateSysroot step painful as my network was having a bad day - rather than synching /opt it will be faster to synch just /opt/vc.

                                  The make step has taken about 6 hours.

                                  I had originally started out with more dev stuff installed on the PI and ran into issues with missing header files as you guys have done, but this way worked. Hope it works for you too! Regards, Mike

                                  U 1 Reply Last reply
                                  1
                                  • M MikePelton

                                    After quite some hours of "fun" I managed to get the (excellent) set of instructions at:

                                    http://visualgdb.com/tutorials/raspberry/qt/embedded/

                                    to work on Windows 10. The trick was to start with a completely clean version of Raspbian, and then to install QT 5.5:

                                    sudo apt-get install qt5-default

                                    Note that I didn't also install Qt Creator on the PI.

                                    If you then follow the instructions to the letter, all will be well.

                                    I found the UpdateSysroot step painful as my network was having a bad day - rather than synching /opt it will be faster to synch just /opt/vc.

                                    The make step has taken about 6 hours.

                                    I had originally started out with more dev stuff installed on the PI and ran into issues with missing header files as you guys have done, but this way worked. Hope it works for you too! Regards, Mike

                                    U Offline
                                    U Offline
                                    user330
                                    wrote on last edited by
                                    #18

                                    @MikePelton I am struggling to get the cross-compiling working for the past three days. while syncing my PI with the windows PC, I have seen all the paths in the above link you have mentioned, but i could not find the /opt. Could you please suggest me, where can be the problem. I have followed exactly the same steps as in http://visualgdb.com/tutorials/raspberry/qt/embedded/ except that my debian jessie was old.

                                    1 Reply Last reply
                                    0
                                    • isoftengineerI Offline
                                      isoftengineerI Offline
                                      isoftengineer
                                      wrote on last edited by
                                      #19

                                      Hi All, after years I have same problem. Do you have any solution?

                                      1 Reply Last reply
                                      0

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved