Projekte mit Qt und Dev-cpp(MinGW) kompilieren



  • Projekte mit Qt und Dev-C++(MinGW) kompilieren

    Inhalt

    • 1 Einleitung
    • 2 Installieren
    • 3 qmake

    1 Einleitung

    Da ich in letzter Zeit oft gefragt wurde, wie man denn die "Qt/Windows Open Source Edition" unter Dev-C++ installiert und ich beim Kompilieren von Projekten Probleme hatte und dafür keine richtige Beschreibung gefunden habe, die das gut zusammenfasst, kam ich auf die Idee, selber was zu schreiben. Also hoffe ich, dass dieser kurze Artikel den Lesern weiterhelfen kann 😉 .

    2 Installieren

    Zunächst sollten Sie erst einmal alles sauber installieren, denn dazu habe ich bisher die meisten Fragen bekommen. Was Sie am Anfang brauchen und ich nur der Vollständigkeit halber hier aufzähle, ist der Dev-C++ und die Qt-Library.

    Dev-C++:
    http://sourceforge.net/projects/dev-cpp/
    Qt/Windows Open Source Edition:
    http://www.qtsoftware.com/downloads

    Das Installieren von Dev-C++ sollte keine Probleme darstellen. Deswegen überspringe ich das gleich und gehe zur Installation von Qt.

    Sie haben jetzt die Wahl zwischen qt-win-opensource-4.4.x-mingw.exe und qt-win-opensource-src-4.4.x.zip. Wenn Sie MinGW bereits installiert haben, was sehr wahrscheinlich ist weil DevCpp MinGW installiert, können Sie die Source Version nehmen.
    Die MinGW Version hat den Vorteil das der Installations-Assistent dabei ist und QT wird schon einmal Kompiliert. Nachdem Sie die ausführbare Datei heruntergeladen haben, können Sie sie ganz normal ausführen und dem Installationsassistenten folgen und damit die Qt-Dateien auf Ihre Festplatte kopieren. Wenn Sie die Source Version runtergeladen haben einfach in ein Verzeichnis ihrer Wahl entpacken. Wobei Sie ein Verzeichnis Pfad ohne Leerzeichen wählen sollten, da der MinGW Kompiler Probleme beim Auflösen von Leerezeichen in Verzeichnispfaden hat.

    Nun müssen die Umgebungsvariablen gesetzt werden und das erledigen wir mit einem kleinem Skript, wobei Sie die Pfade in QTDIR, QMAKESPEC und PATH mit ihrem QT Pfad ändern müssen.

    set QTDIR=C:\Qt\4.4.x
    set PATH=C:\Qt\4.4.x\bin
    set PATH=%PATH%;lokalerDevCppPfad\bin
    set PATH=%PATH%;%SystemRoot%\System32
    set QMAKESPEC=C:\Qt\4.4.x\mkspecs\win32-g++
    

    Jetzt nicht vergessen, in den Qt-Ordner zu wechseln und die configure.exe auszuführen. Dann ist nur noch die Lizenz mit einem 'y' zu bestätigen.


    Bild1

    Das war bisher der einfache Teil, der auch immer bestens klappt, nur kommt dann oft die Frage: "Wie binde ich das jetzt unter Dev-C++ ein?". Da dem gutem evilissimo die Frage anscheinend auch zu oft gestellt wurde, hat er ein kleines Programm geschrieben, das hier sehr hilfreich ist und für Sie ein paar Arbeiten übernimmt. Ich verweise mal gleich darauf: http://www.evilissimo-softdev.de/downloads.html. Es ist der QT-Template-Installer.

    Den kopieren Sie in Ihr Dev-C++-Verzeichnis und führen ihn aus. Jetzt sollte nur kurz ein Fenster aufpoppen und schnell wieder verschwinden. Wenn Sie nun Dev-C++ öffnen, sollte unter "Neue Projekte" im "Basic"-Reiter ein "QT 4.0 Application" auswählbar sein (siehe Bild 2).


    Bild 2

    Um fortzufahren, wählen Sie "QT 4.0 Application" aus und erstellen ein neues Projekt. Danach sehen Sie ein kleines Beispielprogramm, das ein Fenster erstellt, in dem ein Button mit der Beschriftung "Servus Welt" erscheint. Wenn Sie das Programm jetzt kompilieren können, können Sie den nächsten Teil überspringen.

    So, jetzt müssen Sie das ganze auf Ihr System abstimmen. Dazu gehen Sie unter "Tools -> Compiler Options". Dort wählen Sie den Reiter "Directories" und sehen nach, ob die Qt-Include-Verzeichnisse richtig eingetragen sind. Wählen Sie den "C++ Includes"-Reiter aus und suchen nach den Qt-Verzeichnissen. Wenn dort keine sind, müssen Sie mit "Add" "QT\include" und alle Verzeichnisse in "QT\include" einzeln einfügen. So, dass es wie auf Bild 3 aussieht.


    Bild3

    Dasselbe müssen Sie noch mal unter "Project->Project Options" machen. Wenn das erledigt ist, müssen Sie den Reiter "Parameters" auswählen und dort unter Linker alle Verzeichnisse löschen, die sich auf Qt beziehen, und dann mit Hilfe von "Add Library or Object" in das Qt-Verzeichnis gehen und dort alle Dateien auswählen, die im lib-Ordner enthalten sind; auf "OK" klicken und nun sollten sie alle im Linkerfeld erscheinen. Dann klicken Sie auf "OK" und anschließend sollten Sie noch mal versuchen, das Programm zu kompilieren. Wenn es immer noch nicht funktioniert, sollten Sie erst einmal überprüfen, ob Sie irgendetwas übersprungen haben, oder im Forum posten.

    3 qmake

    Bevor es hier weiter geht, kommt ein bisschen Theorie. Was passiert eigentlich, nachdem auf "Kompilieren" gedrückt wurde?


    Bild 4

    Es geschehen folgende Schritte:

    • 1. Es wird das make-Programm ausgeführt, dem das von Dev-C++ erstellte make-file als Parameter angeben wird. In dem make-file stehen die Abhängigkeiten Ihrer Projektdateien.
    • 2. Jetzt werden die cpp-Dateien vom Compiler zu Objektdateien kompiliert. Der Kompiler wandelt also Ihre cpp-Dateien in eine Maschinensprache um.
    • 3. Als Nächstes werden die Objektdateien mit den Bibliotheken gelinkt. Es werden Ihre Dateien mit der oder den Bibliotheken, die Sie benutzen, zu einem Binary File zusammengepackt. Unter Windows heißt das zu einer .EXE Datei.


    Bild 5

    Dasselbe passiert, wenn Sie ein Qt-Projekt kompilieren wollen, nur dass make-files plattform- und compilerabhängig sind. Das hat Trolltech durch eine Spracherweiterung mit Makros gelöst. Wozu und wie intressiert an dieser stelle nicht. Aber wer mehr darüber erfahren möchte, findet Sie hier mehr .
    Im Enddefekt passiert dasselbe, nur dass ein Schritt dazu kommt. Es werden Ihre cpp-Dateien im MOC (Meta Object Compiler) in cpp-Dateien übersetzt. Diese gehen dann an den Compiler und es geht wie oben beschrieben weiter. Der MOC ist im Enddefekt dasselbe wie der Compiler, nur dass er keine Objektdateien generiert, sondern cpp-Dateien. Damit dies funktioniert, müssen Sie mittels qmake erst eine .pro-Datei und dann damit ein make-file generieren.

    Öffnen Sie die Konsole und wechseln Sie in das Projektverzeichnis. Als Erstes müssen Sie die .pro-Datei erstellen. Das passiert, indem Sie

    qmake -project
    

    eingeben. Mit dem Befehl "qmake -project" wird eine .pro Datei erstellt die aus all den Dateien mit folgender Endungen bestehen *.c; *.ui; *.y; *.l; *.ts; *.xlf; *.qrc; *.h; *.hpp; *.hh; *.hxx; *.cpp; *.cc; *.cxx. Wenn Sie mehr Informationen über .pro Files wissen wollen finden Sie hier mehr.

    Wenn jetzt eine leere Zeile und ein neuer Prompt kommt, dann läuft alles richtig.

    Wenn nicht, sondern der Befehl oder die Datei nicht gefunden werden konnte, dann müssen Sie unter "Systemsteuerung->System" den Reiter "Erweitert" und dann den Button "Umgebungsvariablen" auswählen. In dem Dialog unter Systemvariablen suchen Sie nach der Variable "PATH", drücken den "Bearbeiten"-Button und fügen am Ende "DeinQtVerzeichnis\bin" ein. Drücken Sie "OK" und versuchen Sie die Eingabe von "qmake –project" erneut oder Starten Sie den Rechner neu manchmal brauch Windows einen Neustart um neue Systempfade einzupflegen.


    Bild 6

    Zur Kontrolle können Sie in Ihrem Projektordner nachsehen. Dort sollte es jetzt eine .pro-Datei und ein make-file geben. Danach geben Sie "qmake" ein und dann müssten zwei Dateien dazugekommen sein, ein "Makefile.Debug" und ein "Makefile.Release". Damit haben Sie das make-file erstellt und müssen das nun in die Dev-C++-Umgebung einbinden.


    Bild 7

    Dazu gehen Sie wieder zum Dev-C++ zurück und öffnen die "Projektoptionen". Wählen Sie diesmal den "Makefile"-Reiter. Dort klicken Sie die "Use custom make file (…)"-Checkbox aus, wählen den Ordner neben dem leeren Textfeld aus und benutzen jetzt eine der beiden zuletzt erstellten Dateien, was dann in etwa wie auf Bild 6 aussehen sollte.


    Bild 8

    Jetzt sollten Sie das Projekt einmal kompilieren und in dem Release- oder Debugordner nach der *.exe schauen, ob sie ordnungsgemäß erstellt wurde.

    Zum Schluss wollen Sie wahrscheinlich, dass nach dem Kompilieren Dev-C++ die EXE auch ausführen kann. Dafür wählen Sie in dem "Project Options"-Dialog den "Build Options"-Reiter. Daraufhin klicken Sie den Button neben dem "Executable output directory"-Eingabefeld an und wählen dann dementsprechend den "Release"- oder "Debug"-Ordner aus. Schließlich geben Sie im untersten Textfeld den Namen der ausführbaren Datei ein. Jetzt sollte Ihr Programm kompiliert werden. Wenn Sie neue Dateien hinzufügt, müssen Sie auch eine neue .pro-Datei erstellen und den Rest wie oben beschrieben noch einmal durchführen. Wenn Ihnen das zu viel Arbeit ist, können Sie sich auch ein Script schreiben, das Sie anstatt des make-files einfügen und das jedes Mal die vorhin beschriebenen Schritte ausführt.

    Ich hoffe, ich konnte weiterhelfen,

    Gruß mosta

    -----



  • MOT ➡ MOC



  • Und die Screenshot Qualität könnte besser sein. 😃



  • Vielen vielen Dank für diese Anleitung!

    Ich habe ungelogen Tage damit verbracht und herumprobiert, dies zum Laufen zu bringen - doch wenn man nicht weiß, was wichtig ist und was nicht, kann man sich schnell mit unwichtigen Sachen herumschlagen, die letztendlich doch nicht zum Erfolg führen.
    Mit dieser Anleitung habe ich's innerhalb von wenigen Minuten zum Laufen gebracht - sehr schön!



  • Mir erging es wie dem Vorredner, ich habe immer wieder versucht, es zu laufen zu bringen, aber ohne Erfolg, abgesehen von dem heutigen Tag mit dieser Anleitung. Eine Frage hätte ich aber doch noch:
    Es ist im Dev-C++ äußerst mühsam, im Projekt->Projekt Optionen->Verzeichnis->Include-Verzeichnis alle QT Pfade zu korrigieren.

    a) ist es überhaupt notwendig, wenn bereits mit qmake ein makefile erstellt wurde
    b) kann das der Dev nicht allein, oder wenigstens als Standard speichern

    Ich bin leider überfordert mit diesen Fragen... 😕

    Gruß



  • Hi,

    die Zeit, die Du mit dem Eintragen der Compiler-Einstellungen verbringst ist doch nicht zu vergleichen mit der Zeit, die Du vorher mit den vergeblichen Versuchen verbracht hast. Die Einstellungen musst Du nur ein einziges Mal zu Beginn des Projekts machen, dann nicht mehr ... wenn's hoch kommt verbringt ein schneller Tipper/Klicker vielleicht fünf bis zehn Minuten damit ...



  • Kann man doch bestimmt ein Tools für schreiben das das automatisiert!



  • -. schrieb:

    MOT ➡ MOC

    oh, dass das keinem aufgefallen ist

    bitte!! schrieb:

    Kann man doch bestimmt ein Tools für schreiben das das automatisiert!

    Ja, aber das war ja nicht Ziel des Artikels. Aber wenn du zeit und Lust hast, kannst ja loslegen.



  • Hallo,

    erstmal vielen Dank an Mosta für die gute Anleitung.
    Schritt eins und zwei funktionieren bei mir auch einwandfrei.
    Solange ich kein Q_OBJECT mit einbinde lassen sich die Programme auch ohne Schritt drei problemlos compilieren.

    Schritt drei habe ich nichtdestotrotz natürlich auch durchgeführt!

    Ich hab hier ein kleines Programm und werde nicht richtig schlau aus den Fehlermeldungen!

    main.cpp

    #include <QApplication>
    #include <QFont>
    #include <QMainWindow>
    
    #include "my_mainwindow.h"
    
    int main(int argc, char *argv[]) {
        QApplication    app(argc, argv);
        My_MainWindow *window = new My_MainWindow;
        window->show();
    
        return app.exec();
    }
    

    my_mainwindow.cpp

    #ifndef MY_MAINWINDOW_H
    #define MY_MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QWidget>
    
    class My_MainWindow: public QMainWindow 
    {
       Q_OBJECT   
    public:
       My_MainWindow (QWidget *parent = 0);     
    
    private:
    
    };    
    
    My_MainWindow::My_MainWindow(QWidget *parent): QMainWindow(parent)
    {  
    
    }
    
    #endif // MY_MAINWINDOW_H
    

    Lässt sich problemlos ohne Q_OBJECT compilieren aber leider nicht mit!

    Fehlermeldung

    releasemain.o(.text+0x2a):main.cpp: undefined reference to vtable for My_MainWindow' releasemain.o(.text+0x31):main.cpp: undefined reference tovtable for My_MainWindow'
    releasemain.o(.text+0x6a):main.cpp: undefined reference to vtable for My_MainWindow' releasemain.o(.text+0x71):main.cpp: undefined reference tovtable for My_MainWindow'
    collect2: ld returned 1 exit status

    make.exe: *** [release\test2.exe] Error 1

    Ausführung beendet

    Würde mich freuen, wenn ihr mir bei der Poblemlösung helfen könntet.

    Gruss
    Sebastian



  • Hallo Sebastian12,
    hast du mit qmake auch einen makefile erstellt und den dann in deinem Projekt als custom makefile eingebunden.

    mit qmake-project erstellst du ne .pro Datei und mit qmake danach die makefiles. Die du dann unter Project Options einstellst.

    gruß mosta



  • an DevC++ am mich die Einstellungen der Libs etc. auch immer zum
    Haare ausrupfen getrieben. Entlich mal was wo auf den Punkt gebracht wird worauf man achten muss. 👍 😋 👍



  • Also bei mir läuft's nicht. 😞
    Was mir zum Beispiel nicht klar ist: Es gibt ja sowohl den Dev-C++ als auch das Qt an sich entweder zusammen mit dem MinGW, oder eben ohne. Nimmt man jetzt also den Dev-C++ mit MinGW und dafür Qt ohne, oder aber umgekehrt? Weil sonst hätte man ja den MinGW zweimal, was sicher nicht sinnvoll ist?
    Wenn man den Dev-C++ aber ohne MinGW holt, muss man den auch erstmal in Dev-C++ einbinden, und das ist meiner Meinung nach in dieser Anleitung hier nicht mit drin.

    Ich wünschte, es gäbe offizielle Anleitungen von Trolltech, aber das machen die leider für die OpenSource-Version nicht. :-(((



  • Also die einfachste Methode ist es den Dev-Cpp mit MinGW zu installieren und QT ohne MinGW. Dann musst du nur während der installation von QT den Ordner angeben, wo Dec-Cpp den MinGW Compiler plaziert hat.



  • Hallo,

    erstmal vielen Dank an mosta die Anleitung ist Spitze.
    Jetzt hab ich aber noch eine Frage zur Codevervollständigung. Diese zeigt mit nur meine selbst geschriebenen Funktionen an und nicht die schon in Qt enthaltenen. Gibt es da einen Trick??

    Bin für jeden Tipp dankbar.

    Gruß
    mlc



  • meinst du für methoden? den soweit mir bekannt funktioniert das auch mit QT Klassen(komplett ohne trick). Aber die Code completion funktion läuft eh nicht richtig unter Dev-Cpp. Da solltest du aber mal bei bloodshed nachhacken.



  • Hallo,

    weil es wirklich sehr lästig ist, für jedes Projekt die Pfade neu anzupassen, habe ich einen Installer (in Perl) geschrieben, der einen das alles abnimmt - man muss nur den Pfad zum QT Verzeichniss angeben und der Installer erledigt den Rest (man kann nach der Ausführung des Installers sofort anfangen ;-)). Hier ist der Code - viel Spaß 🙂

    #!/usr/bin/perl
    #
    # me = 
    #
    use strict;
    use Cwd;
    
    my @qt4libs = ();
    my @qt4inc = ();
    
    my $qtDir = ();
    my $qt4libs_ = "";
    my $qt4inc_ = "";
    my $devcpplib = "";
    
    print "QT4.0 for Dev-Cpp Wizard\n\n";
    
    # getting full path to qt dir
    do {
      print "Full QT path: ";
      chomp($qtDir = <STDIN>);
      print "--> invalid\n" unless -d $qtDir;
    } until(-d $qtDir);
    
    $qtDir =~ s/(\\|\/)$//;
    
    # get libs
    unless(-d "${qtDir}\\lib") {
      print stderr ("Couldnt find '${qtDir}\\lib'\n");
      exit 1;
    }
    
    push(@qt4libs, $_) foreach(glob "${qtDir}\\lib\\*.a");
    
    # get dirs
    unless(-d "${qtDir}\\include") {
      print stderr ("Couldnt find '${qtDir}\\include'\n");
      exit 1;
    }
    
    opendir(__dh__, "${qtDir}\\include\\") || die $!;
    @qt4inc = map { "${qtDir}\\include\\$_" } (grep { !/^\.{1,2}$/ && -d "${qtDir}\\include\\$_" } readdir __dh__);
    push(@qt4inc, "${qtDir}\\include");
    closedir __dh__;
    
    # try to write config
    unless(-d "Templates") {
      print stderr ("Couldnt find ./Templates");
      exit 1;
    }
    
    # join @qt4libs & @qt4inc & setting $devcpplib
    $qt4libs_ = join "\_@\@_", @qt4libs;
    $qt4inc_ = join ";", @qt4inc;
    $devcpplib = cwd . "/lib";
    
    # writing config
    chdir "Templates";
    
    open(__fh1__, ">QT4 Application.template") || die $!;
    open(__fh2__, ">QT4_Application_main.cpp.txt") || die $!;
    
    print __fh1__ <<EOF;
    [Template]
    ver=1
    Name=QT 4.0 Application
    IconIndex=0
    Description=A basic template for QT 4.0 applications
    Catagory=Basic
    
    [Unit0]
    CName=
    CppName=main.cpp
    C=
    Cpp=QT4_Application_main.cpp.txt
    
    [Project]
    IsCpp=1
    NoConsole=1
    IsDll=0
    UnitCount=1
    Type=0
    Name=QtApp
    Linker=$qt4libs_
    Includes=$qt4inc_
    Libs="$devcpplib"
    EOF
    ;
    
    print __fh2__ <<EOF
    #include <QApplication>
    #include <QFont>
    #include <QPushButton>
    
    int main(int argc, char *argv[]) {
        QApplication    app(argc, argv);
        QPushButton     quit("Servus Welt!");
    
        quit.resize(200, 30);
        quit.setFont(QFont("Arial", 18, QFont::Bold));
        QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
        quit.show();
    
        return app.exec();
    }
    EOF
    ;
    
    print "... done :-)\n";
    


  • Jens G. schrieb:

    Hallo,

    weil es wirklich sehr lästig ist, für jedes Projekt die Pfade neu anzupassen, habe ich einen Installer (in Perl) geschrieben, der einen das alles abnimmt - man muss nur den Pfad zum QT Verzeichniss angeben und der Installer erledigt den Rest (man kann nach der Ausführung des Installers sofort anfangen ;-)). Hier ist der Code - viel Spaß 🙂

    P.S.: Das Script muss im Programmverzeichnis von Dev-Cpp ausgeführt werden 😉



  • Hi,

    hat bei mir prima geklappt.

    Für neue Projekte kopiere ich die entsprechenden Einträge auf der Projektdatei.
    Das spart Arbeit.

    Danke fuer diesen tollen Artikel. Ist sonst echt eine Kopfnuss.

    Gruss



  • Hallo,
    ich habe Probleme beim Ende des 2.Schrittes. Ich komme bis zu der Anweisung: "Dann klicken Sie auf "OK" und anschließend sollten Sie noch mal versuchen, das Programm zu kompilieren. Wenn es immer noch nicht funktioniert, sollten Sie erst einmal überprüfen, ob Sie irgendetwas übersprungen haben, oder im Forum posten." Das nochmalige Compilieren funktioniert nicht, obwohl ich die Verzeichnisse alle eingebunden habe.
    Würde mich sehr freuen, falls mir da jemand weiterhelfen könnte.



  • könntest du vlt. noch sagen was nicht klappt und was für fehlermeldungen kommen?


Anmelden zum Antworten