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. Qt6 cross compile for Windows
Forum Updated to NodeBB v4.3 + New Features

Qt6 cross compile for Windows

Scheduled Pinned Locked Moved Solved Installation and Deployment
8 Posts 3 Posters 5.2k Views 1 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.
  • P Offline
    P Offline
    papoj
    wrote on last edited by
    #1

    Hi,

    I'm trying to cross-compile Qt 6.2.1. Target - Windows, my machine OS - Linux (Mint 20.2) (both 64bit). Unfortunately I can't compile it on Windows.

    My configure cmd:

    ./../qt-everywhere-src-6.2.1/configure -prefix $PWD/. -platform linux-gcc-64 -xplatform win32-g++ -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- -opensource -opengl desktop -qt-host-path /home/papoj/Projects/host_qtbuild
    

    At the end of CMake work I'm getting this:

    CMake Warning:
      Manually-specified variables were not used by the project:
    
        QT_QMAKE_DEVICE_OPTIONS
    

    And then, after cmake --build . --parallel:

    FAILED: qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o 
    /usr/bin/c++ -DHAVE_CONFIG_H -DQT_BOOTSTRAPPED -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_FOREACH -DQT_USE_QSTRINGBUILDER -DQT_VERSION_MAJOR=6 -DQT_VERSION_MINOR=2 -DQT_VERSION_PATCH=1 -DQT_VERSION_STR=\"6.2.1\" -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/Core_autogen/include -I/home/papoj/Projects/qtbuild/qtbase/include -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib -I/home/papoj/Projects/qtbuild/qtbase/src/corelib -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/global -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/kernel -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/tinycbor/src -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore/6.2.1 -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore/6.2.1/QtCore -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/double-conversion/double-conversion -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/double-conversion -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/forkfd -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/.rcc -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/mkspecs/win32-g++ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/home/papoj/Projects/qtbuild/qtbase/src/xml/Xml_autogen/include -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/xml -I/home/papoj/Projects/qtbuild/qtbase/src/xml -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml/6.2.1 -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml/6.2.1/QtXml -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/tools/bootstrap/.. -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/tools/bootstrap/../../3rdparty/tinycbor/src -DNDEBUG -O2 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -ffunction-sections -fdata-sections -mshstk -Wsuggest-override -std=gnu++17 -MD -MT qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o -MF qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o.d -o qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o -c /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/global/qglobal.cpp
    In file included from /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/global/qglobal.cpp:41:
    /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/mkspecs/win32-g++/qplatformdefs.h:55:10: fatal error: tchar.h: No such file or directory
       55 | #include <tchar.h>
          |          ^~~~~~~~~
    

    I suspect that CMake, for some reason, ignore my "CROSS_COMPILE" option and uses Linux c++ tool to compile instead of 'x86_64-w64-mingw32-g++', but I dont know how to fix that. I saw setting flag "-device-option CROSS_COMPILE=.*" in at least few articles/stackoverflow threads about cross-compiling Qt.

    Also I'm not sure if I understand flag 'qt-host-path' correctly - should it point to path where I compiled Qt 6.2.1 for Linux using GCC? Or this should be win MinGW Qt build?

    Hope this is not trivial and stupid question. Thanks!

    raven-worxR 1 Reply Last reply
    0
    • P papoj

      Hi,

      I'm trying to cross-compile Qt 6.2.1. Target - Windows, my machine OS - Linux (Mint 20.2) (both 64bit). Unfortunately I can't compile it on Windows.

      My configure cmd:

      ./../qt-everywhere-src-6.2.1/configure -prefix $PWD/. -platform linux-gcc-64 -xplatform win32-g++ -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- -opensource -opengl desktop -qt-host-path /home/papoj/Projects/host_qtbuild
      

      At the end of CMake work I'm getting this:

      CMake Warning:
        Manually-specified variables were not used by the project:
      
          QT_QMAKE_DEVICE_OPTIONS
      

      And then, after cmake --build . --parallel:

      FAILED: qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o 
      /usr/bin/c++ -DHAVE_CONFIG_H -DQT_BOOTSTRAPPED -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_FOREACH -DQT_USE_QSTRINGBUILDER -DQT_VERSION_MAJOR=6 -DQT_VERSION_MINOR=2 -DQT_VERSION_PATCH=1 -DQT_VERSION_STR=\"6.2.1\" -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/Core_autogen/include -I/home/papoj/Projects/qtbuild/qtbase/include -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib -I/home/papoj/Projects/qtbuild/qtbase/src/corelib -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/global -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/kernel -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/tinycbor/src -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore/6.2.1 -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore/6.2.1/QtCore -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/double-conversion/double-conversion -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/double-conversion -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/forkfd -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/.rcc -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/mkspecs/win32-g++ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/home/papoj/Projects/qtbuild/qtbase/src/xml/Xml_autogen/include -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/xml -I/home/papoj/Projects/qtbuild/qtbase/src/xml -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml/6.2.1 -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml/6.2.1/QtXml -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/tools/bootstrap/.. -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/tools/bootstrap/../../3rdparty/tinycbor/src -DNDEBUG -O2 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -ffunction-sections -fdata-sections -mshstk -Wsuggest-override -std=gnu++17 -MD -MT qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o -MF qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o.d -o qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o -c /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/global/qglobal.cpp
      In file included from /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/global/qglobal.cpp:41:
      /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/mkspecs/win32-g++/qplatformdefs.h:55:10: fatal error: tchar.h: No such file or directory
         55 | #include <tchar.h>
            |          ^~~~~~~~~
      

      I suspect that CMake, for some reason, ignore my "CROSS_COMPILE" option and uses Linux c++ tool to compile instead of 'x86_64-w64-mingw32-g++', but I dont know how to fix that. I saw setting flag "-device-option CROSS_COMPILE=.*" in at least few articles/stackoverflow threads about cross-compiling Qt.

      Also I'm not sure if I understand flag 'qt-host-path' correctly - should it point to path where I compiled Qt 6.2.1 for Linux using GCC? Or this should be win MinGW Qt build?

      Hope this is not trivial and stupid question. Thanks!

      raven-worxR Offline
      raven-worxR Offline
      raven-worx
      Moderators
      wrote on last edited by raven-worx
      #2

      @papoj
      the device-option/CROSS_COMPILE way is the old way for qmake cross builds. With CMake you have to provide a CMake toolchain file.
      See this: https://doc.qt.io/qt-6/configure-linux-device.html
      Its for Linux cross compilation, but it shows how to specify the CMake toolchain file.

      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
      If you have a question please use the forum so others can benefit from the solution in the future

      1 Reply Last reply
      3
      • P Offline
        P Offline
        papoj
        wrote on last edited by
        #3

        Thanks for your answer @raven-worx - I've compiled qt6 finally (after some additional troubles :D).

        But now I'm again lost a little bit - I got qmake.exe as a result (and many more, anyway), so I cannot choose this as "Qt version" in Qt Creator on Linux, to build Qt app for Windows (because of .exe).
        As mentioned here: https://forum.qt.io/topic/94742/cross-compile-and-deploy-from-linux-to-windows I have MinGW for Linux and Qt6 compiled with that MinGW. Can I connect those two somehow to get app exe for Windows?

        Thanks again!

        raven-worxR 1 Reply Last reply
        0
        • P papoj

          Thanks for your answer @raven-worx - I've compiled qt6 finally (after some additional troubles :D).

          But now I'm again lost a little bit - I got qmake.exe as a result (and many more, anyway), so I cannot choose this as "Qt version" in Qt Creator on Linux, to build Qt app for Windows (because of .exe).
          As mentioned here: https://forum.qt.io/topic/94742/cross-compile-and-deploy-from-linux-to-windows I have MinGW for Linux and Qt6 compiled with that MinGW. Can I connect those two somehow to get app exe for Windows?

          Thanks again!

          raven-worxR Offline
          raven-worxR Offline
          raven-worx
          Moderators
          wrote on last edited by
          #4

          @papoj
          did you specify QT_BUILD_TOOLS_WHEN_CROSSCOMPILING? If so you should have a script called host-qmake. I currently dont know if QtCreator accecpts any executables other than exactly qmake.
          The host-qmake points to your mingw compiled Qt. Also take a look into qt.conf
          Also read this whole article: https://www.qt.io/blog/qt-6-build-system

          --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
          If you have a question please use the forum so others can benefit from the solution in the future

          P 1 Reply Last reply
          2
          • raven-worxR raven-worx

            @papoj
            did you specify QT_BUILD_TOOLS_WHEN_CROSSCOMPILING? If so you should have a script called host-qmake. I currently dont know if QtCreator accecpts any executables other than exactly qmake.
            The host-qmake points to your mingw compiled Qt. Also take a look into qt.conf
            Also read this whole article: https://www.qt.io/blog/qt-6-build-system

            P Offline
            P Offline
            papoj
            wrote on last edited by
            #5

            @raven-worx thanks again, hope I'm not annoying (at least yet :D).
            Indeed I have host-qmake script in my build path.

            #!/bin/sh
            
            # The directory of this script is the expanded absolute path of the "$qt_prefix/bin" directory.
            script_dir_path=`dirname $0`
            script_dir_path=`(cd "$script_dir_path"; /bin/pwd)`
            
            /home/papoj/Qt/6.2.1/gcc_64/bin/qmake -qtconf "$script_dir_path/target_qt.conf" $*
            

            I tried to use this host-qmake to generate new .pro file (with flag -project) and with already existing .pro file from my project. In both cases output was same:

            Info: creating stash file /home/papoj/Projects/SampleProject/.qmake.stash
            Project ERROR: Cannot run target compiler 'g++'. Output:
            ===================
            g++: error: command line option '-fno-keep-inline-dllexport' is not supported by this configuration
            Using built-in specs.
            COLLECT_GCC=g++
            OFFLOAD_TARGET_NAMES=nvptx-none:hsa
            OFFLOAD_TARGET_DEFAULT=1
            Target: x86_64-linux-gnu
            Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
            Thread model: posix
            gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 
            ===================
            Maybe you forgot to setup the environment?
            

            -fno-keep-inline-dllexport flag is not available with g++ (but is available with x86_64-w64-mingw32-g++). Also --host points to good platform, but --target not - it should be win32 (or something with Windows).
            I tried to find qt.conf file in my whole "Projects" directory. I've found it only in source code for Qt 6.2.1 and in mingw81_64 directory copied from Windows. But there is target_qt.conf in my Qt build directory.

            [Paths]
            Prefix=../
            HostPrefix=../../../Qt/6.2.1/gcc_64
            HostData=../../../Projects/qt6
            Sysroot=
            SysrootifyPrefix=false
            TargetSpec=win32-g++
            HostSpec=linux-g++
            

            Looks fine, especially TargetSpec=win32-g++.

            Did I miss something? I read that article about build system for a few times and I did not find anything which could help in this situation, but maybe I don't understand something or understand it wrongly.

            raven-worxR 1 Reply Last reply
            0
            • P papoj

              @raven-worx thanks again, hope I'm not annoying (at least yet :D).
              Indeed I have host-qmake script in my build path.

              #!/bin/sh
              
              # The directory of this script is the expanded absolute path of the "$qt_prefix/bin" directory.
              script_dir_path=`dirname $0`
              script_dir_path=`(cd "$script_dir_path"; /bin/pwd)`
              
              /home/papoj/Qt/6.2.1/gcc_64/bin/qmake -qtconf "$script_dir_path/target_qt.conf" $*
              

              I tried to use this host-qmake to generate new .pro file (with flag -project) and with already existing .pro file from my project. In both cases output was same:

              Info: creating stash file /home/papoj/Projects/SampleProject/.qmake.stash
              Project ERROR: Cannot run target compiler 'g++'. Output:
              ===================
              g++: error: command line option '-fno-keep-inline-dllexport' is not supported by this configuration
              Using built-in specs.
              COLLECT_GCC=g++
              OFFLOAD_TARGET_NAMES=nvptx-none:hsa
              OFFLOAD_TARGET_DEFAULT=1
              Target: x86_64-linux-gnu
              Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
              Thread model: posix
              gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 
              ===================
              Maybe you forgot to setup the environment?
              

              -fno-keep-inline-dllexport flag is not available with g++ (but is available with x86_64-w64-mingw32-g++). Also --host points to good platform, but --target not - it should be win32 (or something with Windows).
              I tried to find qt.conf file in my whole "Projects" directory. I've found it only in source code for Qt 6.2.1 and in mingw81_64 directory copied from Windows. But there is target_qt.conf in my Qt build directory.

              [Paths]
              Prefix=../
              HostPrefix=../../../Qt/6.2.1/gcc_64
              HostData=../../../Projects/qt6
              Sysroot=
              SysrootifyPrefix=false
              TargetSpec=win32-g++
              HostSpec=linux-g++
              

              Looks fine, especially TargetSpec=win32-g++.

              Did I miss something? I read that article about build system for a few times and I did not find anything which could help in this situation, but maybe I don't understand something or understand it wrongly.

              raven-worxR Offline
              raven-worxR Offline
              raven-worx
              Moderators
              wrote on last edited by
              #6

              @papoj said in Qt6 cross compile for Windows:

              But there is target_qt.conf in my Qt build directory.

              yes thats the one i meant (and which is referenced in the host-qmake script).
              The TargetSpec=win32-g++ means that qmake looks for a "win32-g++" mkspec folder in <host-qt6>/qtbase/mkspecs

              I didnt know that you intent to use qmake rather than cmake as your build system.
              So you have 2 options from here:

              1. again compile Qt6 with the cmake toolchain option AND the old parameters (-platform linux-gcc-64 -xplatform win32-g++ -device-option CROSS_COMPILE=...). I think this should still work for all qmake dependent stuff.
              2. manually edit <host-qt6>/qtbase/mkspecs/win32-g++/qmake.conf to call your correct mingw cross-compiler

              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
              If you have a question please use the forum so others can benefit from the solution in the future

              P 1 Reply Last reply
              2
              • raven-worxR raven-worx

                @papoj said in Qt6 cross compile for Windows:

                But there is target_qt.conf in my Qt build directory.

                yes thats the one i meant (and which is referenced in the host-qmake script).
                The TargetSpec=win32-g++ means that qmake looks for a "win32-g++" mkspec folder in <host-qt6>/qtbase/mkspecs

                I didnt know that you intent to use qmake rather than cmake as your build system.
                So you have 2 options from here:

                1. again compile Qt6 with the cmake toolchain option AND the old parameters (-platform linux-gcc-64 -xplatform win32-g++ -device-option CROSS_COMPILE=...). I think this should still work for all qmake dependent stuff.
                2. manually edit <host-qt6>/qtbase/mkspecs/win32-g++/qmake.conf to call your correct mingw cross-compiler
                P Offline
                P Offline
                papoj
                wrote on last edited by
                #7

                @raven-worx thanks! Everything works now, I had to do both options mentioned by you. This time CMake did not return any warning with "QT_QMAKE_DEVICE_OPTIONS" - maybe it need to be mixed together with CMake toolchain, idk.

                1 Reply Last reply
                0
                • NevezN Offline
                  NevezN Offline
                  Nevez
                  wrote on last edited by
                  #8

                  hey, i'm getting the same error too. Can you please help me? .
                  I would appreciate if you explain in detail what exactly I need to do.

                  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