Qt-Creator mit MinGW kompilieren

  • C++

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Renati.

    Qt-Creator mit MinGW kompilieren

    Hi,

    ich habe folgendes Problem: Ich habe unter Windows 7 mit MinGW die neuste Version der Qt-Library (5.0.0) kompiliert. Jetzt möchte ich mit der erstellten Bibliothek Qt-Creator bzw. meine Projekte kompilieren.
    Egal was ich versuche zu kompilieren, der Linker bricht immer ab, weil eine Library fehlt. Hier die Ausgabe des Compilers:

    Quellcode

    1. D:\Qt\qt5_creator\build>"D:\Qt\qt5\qtbase\bin\qmake" "D:\Qt\qt5_creator\source\q
    2. tcreator.pro"


    Quellcode

    1. D:\Qt\qt5_creator\build>mingw32-make release
    2. cd src\ && ( if not exist Makefile D:\Qt\qt5\qtbase\bin\qmake D:\Qt\qt5_creator\source\src\src.pro -o Makefile ) && mingw32-make -f Makefi
    3. mingw32-make[1]: Entering directory 'D:/Qt/qt5_creator/build/src'
    4. cd libs\aggregation\ && ( if not exist Makefile D:\Qt\qt5\qtbase\bin\qmake D:\Qt\qt5_creator\source\src\libs\aggregation\aggregation.pro -
    5. Makefile release
    6. mingw32-make[2]: Entering directory 'D:/Qt/qt5_creator/build/src/libs/aggregation'
    7. mingw32-make -f Makefile.Release
    8. mingw32-make[3]: Entering directory 'D:/Qt/qt5_creator/build/src/libs/aggregation'
    9. g++ -x c++-header -c -pipe -fno-keep-inline-dllexport -O2 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DIDE_LIBRARY_BASENAME=\"l
    10. _USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DQT_DISABLE_DEPRECATED_BEFORE=0x040900 -DAGGREGATION_LIBRARY -DQT_NO_DEBUG -DQT_WIDGE
    11. _GUI_LIB -DQT_CORE_LIB -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -I..\..\..\..\source\src\libs\aggregation -I"..\..\..\src" -I"..\..\..\..\s
    12. eator\source\tools" -I"..\..\..\..\source\src\plugins" -I"..\..\..\..\..\qt5\qtbase\include" -I"..\..\..\..\..\qt5\qtbase\include\QtWidget
    13. \include\QtConcurrent" -I"..\..\..\..\..\qt5\qtbase\include\QtGui" -I"..\..\..\..\..\qt5\qtbase\include\QtCore" -I"release" -I"." -I"..\..
    14. n32-g++" -o release\qtcreator_pch.h.gch\c++ ..\..\..\..\source\src\shared\qtcreator_pch.h
    15. g++ -c -include release\qtcreator_pch.h -pipe -fno-keep-inline-dllexport -O2 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DIDE_L
    16. _CAST_TO_ASCII -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DQT_DISABLE_DEPRECATED_BEFORE=0x040900 -DAGGREGATION_LIBRARY -DQT_
    17. CONCURRENT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -I..\..\..\..\source\src\libs\aggregation -I"..\..\..\sr
    18. bs" -I"D:\Qt\qt5_creator\source\tools" -I"..\..\..\..\source\src\plugins" -I"..\..\..\..\..\qt5\qtbase\include" -I"..\..\..\..\..\qt5\qtba
    19. ..\..\..\qt5\qtbase\include\QtConcurrent" -I"..\..\..\..\..\qt5\qtbase\include\QtGui" -I"..\..\..\..\..\qt5\qtbase\include\QtCore" -I"rele
    20. 5\qtbase\mkspecs\win32-g++" -o release\aggregate.o ..\..\..\..\source\src\libs\aggregation\aggregate.cpp
    21. D:\Qt\qt5\qtbase\bin\moc.exe -DUNICODE -DIDE_LIBRARY_BASENAME=\"lib\" -DQT_NO_CAST_TO_ASCII -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONC
    22. ED_BEFORE=0x040900 -DAGGREGATION_LIBRARY -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_CONCURRENT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_OPENGL_ES_2 -D
    23. \..\source\src\libs\aggregation -I"..\..\..\src" -I"..\..\..\..\source\src\libs" -I"D:\Qt\qt5_creator\source\tools" -I"..\..\..\..\source\
    24. qt5\qtbase\include" -I"..\..\..\..\..\qt5\qtbase\include\QtWidgets" -I"..\..\..\..\..\qt5\qtbase\include\QtConcurrent" -I"..\..\..\..\..\q
    25. ..\..\..\..\qt5\qtbase\include\QtCore" -I"release" -I"." -I"..\..\..\..\..\qt5\qtbase\mkspecs\win32-g++" -D__GNUC__ -DWIN32 ..\..\..\..\so
    26. gate.h -o release\moc_aggregate.cpp
    27. g++ -c -include release\qtcreator_pch.h -pipe -fno-keep-inline-dllexport -O2 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DIDE_L
    28. _CAST_TO_ASCII -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DQT_DISABLE_DEPRECATED_BEFORE=0x040900 -DAGGREGATION_LIBRARY -DQT_
    29. CONCURRENT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -I..\..\..\..\source\src\libs\aggregation -I"..\..\..\sr
    30. bs" -I"D:\Qt\qt5_creator\source\tools" -I"..\..\..\..\source\src\plugins" -I"..\..\..\..\..\qt5\qtbase\include" -I"..\..\..\..\..\qt5\qtba
    31. ..\..\..\qt5\qtbase\include\QtConcurrent" -I"..\..\..\..\..\qt5\qtbase\include\QtGui" -I"..\..\..\..\..\qt5\qtbase\include\QtCore" -I"rele
    32. 5\qtbase\mkspecs\win32-g++" -o release\moc_aggregate.o release\moc_aggregate.cpp
    33. g++ -Wl,-s -shared -mthreads -Wl,--out-implib,D:\Qt\qt5_creator\build\lib\qtcreator\libAggregation.a -o ..\..\..\lib\qtcreator\Aggregation
    34. e/moc_aggregate.o -LD:/Qt/qt5_creator/build/lib/qtcreator -LD:/Qt/qt5/qtbase/lib -lQt5Widgets -lQt5Concurrent -lQt5Gui -lQt5Core -llibEGL
    35. d:/qt/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -llibEGL
    36. d:/qt/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -llibGLESv2
    37. collect2.exe: error: ld returned 1 exit status
    38. Makefile.Release:78: recipe for target '..\..\..\lib\qtcreator\Aggregation.dll' failed
    39. mingw32-make[3]: *** [..\..\..\lib\qtcreator\Aggregation.dll] Error 1
    40. mingw32-make[3]: Leaving directory 'D:/Qt/qt5_creator/build/src/libs/aggregation'
    41. Makefile:48: recipe for target 'release' failed
    42. mingw32-make[2]: *** [release] Error 2
    43. mingw32-make[2]: Leaving directory 'D:/Qt/qt5_creator/build/src/libs/aggregation'
    44. Makefile:435: recipe for target 'sub-libs-aggregation-sub_Release_ordered' failed
    45. mingw32-make[1]: *** [sub-libs-aggregation-sub_Release_ordered] Error 2
    46. mingw32-make[1]: Leaving directory 'D:/Qt/qt5_creator/build/src'
    47. makefile:340: recipe for target 'sub-src-sub_Release_ordered' failed
    48. mingw32-make: *** [sub-src-sub_Release_ordered] Error 2


    Die entscheidenden Zeilen:

    Quellcode

    1. d:/qt/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -llibEGL
    2. d:/qt/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -llibGLESv2
    3. collect2.exe: error: ld returned 1 exit status


    Ich frage mich nun, wo ich diese Library herbekommen kann, da ich im Internet relativ wenig dazu gefunden habe (wenn dann nur im Zusammenhang mit Linux). Und es wundert mich auch, wieso diese Library überhaupt benötigt wird, weil ich in meinen Projekten (die beim Kompilieren auch nach der Library verlangen) diese nie in der *.pro-Datei angegeben habe. Anscheinend irgendeine Abhängigkeit durch die Qt-Library.

    Kann es sein, dass ich beim Erstellen der Qt-Library selbst schon Fehler gemacht habe?

    Ich verwende folgende Systemvariablen:

    Quellcode

    1. set INCLUDE=C:\Qt\qt5_deps\icu\dist\include;C:\Qt\qt5_deps\openssl-1.0.1c\dist\include
    2. set LIB=C:\Qt\qt5_deps\icu\dist\lib;C:\Qt\qt5_deps\openssl-1.0.1c\dist\lib
    3. set QMAKESPEC=
    4. set QTDIR=
    5. set PATH=D:\Qt\qt5\qtbase\bin;D:\Qt\qt5\gnuwin32\bin;D:\Qt\mingw\bin;D:\Qt\strawberry-perl-5.16.2.1-64bit\perl\bin;
    6. "D:\Python 2.7.3";D:\Qt\ruby-1.9.3-p362-i386-mingw32\ruby-1.9.3-p362-i386-mingw32\bin;
    7. D:\Qt\qt5_deps\icu\dist\lib;D:\Qt\qt5_deps\openssl-1.0.1c\dist\bin;
    8. D:\Qt\PortableGit-1.8.0-preview20121022\cmd;C:\Windows\System32
    9. set MAKE_COMMAND=


    Fehlt mir hier vielleicht einfach ein Pfad?

    Die Qt-Library wurde mit folgender Konfiguration erstellt:

    Quellcode

    1. configure -debug-and-release -opensource -confirm-license -platform win32-g++ -developer-build -c++11 -icu -opengl desktop -openssl -plugin-sql-odbc -qt-style-windowsxp -qt-style-windowsvista -nomake tests


    Wenn jemand schon die 5er Version von Qt mit MinGW zum Laufen gebracht hat, dann wäre ich für Hilfe sehr dankbar :)

    Edit: Jetzt habe ich nochmal versucht, die Qt-Library selbst zu kompilieren, aber das hat jetzt scheinbar auch nicht mehr funktioniert:

    Quellcode

    1. ....
    2. tools\qcollator.cpp:47:28: fatal error: unicode/utypes.h: No such file or directory
    3. compilation terminated.
    4. Makefile.Release:13181: recipe for target '.obj/release_shared/qcollator.o' failed
    5. mingw32-make[4]: *** [.obj/release_shared/qcollator.o] Error 1
    6. mingw32-make[4]: Leaving directory 'D:/Qt/qt5/qtbase/src/corelib'
    7. Makefile:48: recipe for target 'release' failed
    8. mingw32-make[3]: *** [release] Error 2
    9. mingw32-make[3]: Leaving directory 'D:/Qt/qt5/qtbase/src/corelib'
    10. Makefile:589: recipe for target 'sub-corelib-sub_Release' failed
    11. mingw32-make[2]: *** [sub-corelib-sub_Release] Error 2
    12. mingw32-make[2]: Leaving directory 'D:/Qt/qt5/qtbase/src'
    13. Makefile:268: recipe for target 'sub-src-sub_Release' failed
    14. mingw32-make[1]: *** [sub-src-sub_Release] Error 2
    15. mingw32-make[1]: Leaving directory 'D:/Qt/qt5/qtbase'
    16. makefile:637: recipe for target 'module-qtbase-sub_Release' failed
    17. mingw32-make: *** [module-qtbase-sub_Release] Error 2


    Anscheinend fehlt die Datei utypes.h. Vielleicht ist der Fehler auch schon beim 1. Kompilieren aufgetreten und mir nur nicht aufgefallen (immerhin sind ja 48 Qt-Dlls und -Anwendungen im Ausgabeverzeichnis gelandet).

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Infinity“ ()

    Ohne mich jetzt zu vertiefen:
    - sind die Pfade (System-Variable, Compilereinstellungen) richtig gesetzt?
    - ggf. hat der Compiler vordefinierte Pfade, die jedoch leer / nicht vorhanden sind,
    - wende Dich an ein Qt-Forum
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort. Ich werde jetzt erst mal alle Pfade checken. Auf Qt-Centre habe ich auch schon vorher gefragt, allerdings nichts weiter herausgefunden.
    Aber eigentlich habe ich das schon fast erwartet - das Problem kann man einfach schwer nachvollziehen, wenn man nicht vor dem selben Rechner sitzt.

    Edit: 2 falsche Pfade habe ich gefunden, mal schauen, ob es jetzt funktioniert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()

    Infinity schrieb:

    das Problem kann man einfach schwer nachvollziehen
    wenn man nicht schon mal mit Qt gearbeitet hat. Und das haben hier im Forum die wenigsten.
    Wnn es klappt, poste bitte die Lösung, sie könnte mich auch interessieren. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe mal nach dieser Anleitung erfolgreich die Bibliothek Qt 4.8.1 für 64 bit compiliert.
    Ist aber mit VS kompiliert.
    Konntest du denn deine Projekte mit einer älteren Qt Version kompilieren?
    Wenn ja, dann ist wohl was beim "selber kompilieren" schief gelaufen.
    Ich denke, ich habe mein Problem bereits gefunden bzw. es waren mehrere Fehler:

    1. Zwei falsche Laufwerksbuchstaben in den Pfaden vertauscht
    2. Anführungszeichen darf man scheinbar nicht bei den Pfadangaben in der %Path%-Variable machen
    3. Einen Patch falsch übernommen

    Ob es jetzt geht, weiß ich allerdings noch nicht, denn ich bin gerade immer noch beim Kompilieren, was sehr lange dauert (aber ich bin schon weiter gekommen als zuvor). Dass ich vorher weder meine Projekte noch Qt-Creator erstellen konnte lag daran, dass schon die Qt-Library unvollständig erstellt wurde.

    Konntest du denn deine Projekte mit einer älteren Qt Version kompilieren?

    An den Projekten lag es wie schon gesagt nicht. Außerdem sind alte Projekte nicht mehr mit der Version 5.0 kompatibel bzw. man muss kleine Änderungen vornehmen.

    Edit: Tja, gerade ist der Build-Vorgang wieder abgebrochen. Diesmal war die Fehlermeldung "Zugriff verweigert." bei einer Datei. An den Rechten kann es nicht liegen, weil ich die Konsole schon mal vorsorglich als Admin gestartet habe. Vielleicht war die Datei einfach noch irgendwo fehlerhafter weise geöffnet. Ich werde es einfach nochmal versuchen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()

    Weil es hier auch so gemacht wird: qt-project.org/wiki/MinGW-64-bit
    Kannst du mir genauer erklären, wieso ich make verwenden soll bzw. wo ich das finde? In meinem MinGW/bin-Verzeichnis gibt es keine make.exe.

    Im Moment bin ich immer noch am kompilieren (habe den Rechner gestern nicht lange weiterlaufen lassen, sondern in den Ruhezustand versetzt). Vor allem die Kompilierung von Webkit scheint ziemlich viel Zeit in Anspruch zu nehmen. Wieso dauert das Kompilieren eigentlich so lange (mein Rechner ist relativ leistungsfähig und es wird auch oft nicht mal ein Kern vollständig genutzt)?

    Infinity schrieb:

    und es wird auch oft nicht mal ein Kern vollständig genutzt
    Ich kenn mich mit mingw32-make nicht aus, aber schau mal in die Optionen von mingw32-make (also --help, -h, /help oder sowas) denn make hat ein -j (--jobs) flag mit dem man einstellen kann wieviele Jobs auf einmal laufen (z.B. Anzahl Kerne + 1 bei dem CFS von Linux, Windows müsstest du googeln) dann sind auch alle Kerne ausgelastet. Ist aber trotzdem eine Menge Kram zum kompilieren.
    Ich kann nur den Link empfehlen, den ich oben gepostet habe. (64 bit Qt mit visual studio Command line kompilieren)
    Die make Datei müsste automatisch bei den Source Dateien mitgeliefert sein.
    Ich habs auch mit make gemacht.

    Beim Kompilieren hat er alle 4 Kerne 100% genutzt (i5 2500 -> 4*3.4 Ghz) .
    Das hat dann statt 10 Stunden nur 2,5 Stunden gedauert. ^^

    Aber Vorsicht, du kannst das Verzeichnis deines Builds nach dem Kompileren nicht mehr ändern. (zumindest weiß ich nicht wie)
    Das heißt, man sollte es da kompilieren wo man es dann später haben möchte.
    In der Hilfe steht im Prinzip das, was du geschrieben hast. Allerdings steht auch dabei, dass wenn man nicht den Parameter -j hinzufügt, automatisch die maximal mögliche Zahl an Jobs gleichzeitig ausgeführt wird. Mit dem Process-Explorer konnte ich auch nachvollziehen, dass mehrere Jobs gleichzeitig liefen, allerdings jeweils trotzdem nur mit einer sehr bescheidenen CPU-Auslastung. Aber ja 2,5 h kommen ungefähr hin, vielleicht bei mir eine halbe Stunde mehr (kann ich wegen der Unterbrechung/Ruhezustand nicht mehr genau nachvollziehen). Ich habe zufällig den selben Prozessor wie du, also könnte man die Zeiten sogar miteinander vergleichen.

    Aber egal, Qt ist jetzt erfolgreich kompiliert (ich weiß nicht, woran die der eine Abbruch mit der Fehlermeldung "Zugriff Verweigert" gescheitert ist) und auch Qt-Creator konnte ich erstellen.

    Wnn es klappt, poste bitte die Lösung, sie könnte mich auch interessieren.

    Ich habe mich ziemlich genau (bis auf die Fehler :) ) an die schon oben gepostete Anleitung gehalten: qt-project.org/wiki/MinGW-64-bit

    Man muss einfach nur aufpassen, dass man keine Fehler (vor allem bei den Pfaden) macht und die richtigen Versionen der ganzen anderen benötigten Software verwendet. Fürs Erstellen vom Qt-Creator kann man (wie bei jedem anderen Projekt auch) dann einfach mit qmake das Makefile erstellen und mingw32-make ausführen.

    @Renati: Das Thema ist zwar erledigt, aber wieso du von mingw32-make abrätst würde mich trotzdem noch interessieren.

    Infinity schrieb:

    Weil es hier auch so gemacht wird: qt-project.org/wiki/MinGW-64-bit
    Kannst du mir genauer erklären, wieso ich make verwenden soll bzw. wo ich das finde? In meinem MinGW/bin-Verzeichnis gibt es keine make.exe.

    Weil mingw32-make eine für Windows zurechtgefrickelte Standalone-Version ist. Das führt regelmäßig zu Problemen. Du kannst stattdessen die MSYS-Version benutzen, wenn du ein "echtes" make benutzen willst / musst. Muss nicht heißen, dass das immer ein Problem ist, ist aber immer meine erste Annahme bei merkwürdigen Fehlern. ;)
    Insbesondere in GCC-Toolchains ist das auch meistens der Fehler, weil dort oft genau das Verhalten von make erwartet wird.