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()