Kategorien
Ohne Kategorie

Qt5 Anwendung mit MinGW 9 übersetzen

Versucht man eine Qt5 Anwendung mit MinGW-W64 zu übersetzen, stößt man sehr wahrscheinlich auf folgendes Problem:

In file included from /usr/lib/gcc/x86_64-w64-mingw32/9.3-posix/include/c++/bits/stl_algo.h:59,
                 from /usr/lib/gcc/x86_64-w64-mingw32/9.3-posix/include/c++/algorithm:62,
                 from /opt/Qt5/include/QtCore/qglobal.h:142,
                 ...

/usr/lib/gcc/x86_64-w64-mingw32/9.3-posix/include/c++/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
   75 | #include_next <stdlib.h>
      |               ^~~~~~~~~~
compilation terminated.

Hilfreich dabei war ein Blog-Eintrag von ocroquette: Die Fehlerursache liegt in den System-Includepfaden, die man gcc mit dem -isystem Schalter mitteilt. Leider fügt Qt5 seine eigenen Headerdateien selbst als System-Include hinzu und sorgt dadurch dafür, dass der Standard-Includepfad von MinGW32 nicht mehr von den Qt5 Headerdateien beachtet wird. Zur Lösung muss man diesen manuell hinzufügen, beispielsweise in CMake:

if (${MINGW})
    list(APPEND CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES /usr/x86_64-w64-mingw32/include)
endif()

Dieser Codeschnipsel sollte am besten nach dem Importieren von Qt5 und vor dem Definieren eigener Targets einfügen.

Nachtrag vom 14.10.2020:

Mit Qt 5.14 kommt ein weiteres Problem hinzu, hier kommt der Fehler schon beim importieren von Qt5::Core zum Vorschein, jedoch findet MinGW diesmal seine Standardbibliotheken nicht mehr:

CMake Error at /opt/Qt5/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:92 (message):
    Library not found: mpr
Call Stack (most recent call first):
    /opt/Qt5/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:272 (_qt5_Core_process_prl_file)
  /opt/Qt5/lib/cmake/Qt5/Qt5Config.cmake:28 (find_package)
  CMakeLists.txt:13 (find_package)

Auch hier bringt Qt5 wohl den Standardincludepfad durcheinander, und der Fix ist sehr ähnlich wie oben:

if (${MINGW})
    list(APPEND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES /usr/x86_64-w64-mingw32/lib)
endif()