[Tutorial] Qt statisch builden und in Creator einbinden



  • Dieses Tutorial erklärt, wie ihr Qt neu buildet um es später statisch zu linken. Die Anleitung bezieht sich auf den Creator 5.1 und den libs 4.8.6. Sollte aber auch mit allen anderen funktionieren. Zuletzt getestet mit 5.3.1 (bitte Hinweise am Ende beachten.
    Ich habe ich dabei stark an diesen Wiki eintrag http://qt-project.org/wiki/Build_Static_Qt_For_Windows_With_Gcc_German gehalten.
    Die Versionsnummern sind nicht mehr aktuell. Nehmt am besten die neusten.

    "Neues Tutorial für 5.3.1":https://qt-project.org/forums/viewthread/45781/

    ===============DOWNLOADS===============
    Qt Creator mit den Qt libs: http://qt-project.org/downloads.
    Source (qt-everywhere-opensource-src-X.X.X.zip): http://download.qt-project.org/official_releases/qt/
    Perl: http://www.activestate.com/activeperl/downloads.

    ===============INSTALLATION===============
    Installiert den Qt Creator mit den dynamischen libs. Die Source braucht ihr nicht.
    Als Beispiel Pfad nehme ich jetzt mal
    C:\Qt\Qt5.0.2...

    Danach entpackt ihr die libs nach C:\Qt\Qt_static... (keine Leer- und/oder Sonderzeichen!)

    Jetzt müsst ihr noch Perl installieren.

    ===============VORBEREITUNG===============
    Nun müssen noch die Umgebungsvariablen gesetzt werden.
    Dafür geht ihr auf Systemsteuerung>System und Sicherheit>System >erweiterte Systemeinstellungen>Umgebungsvariablen.
    Dort erstellt ihr zwei neue unter den Benutzervariablen(!)

    Name 1: QMAKESPEC
    Wert 1: C:\Qt\Qt_static\mkspecs\win32-g++

    Name 2: QTDIR
    Wert 2: C:\Qt\Qt_static

    Nun werden die Dateien für static build vorbereitet:
    Öffnet die Datei qmake.conf im Ordner C:\Qt\Qt_static\mkspecs\win32-g++
    Dort ergänzt ihr das dickgeschriebene:
    QMAKE_CFLAGS_RELEASE = -Os -momit-leaf-frame-pointer
    QMAKE_LFLAGS = -static -static-libgcc
    DEFINES += QT_STATIC_BUILD

    Jetzt für die Datei Makefile.win32-g++ im Ordner C:\Qt\Qt_static\qmake
    LFLAGS = -static -static-libgcc

    ===============QT STATISCH BUILDEN===============
    Öffnet eine Konsole. Wichtig es muss eine Windows Konsole sein. Nicht die von Qt.
    Dann wechselt ihr in das Verzeichnis C:\Qt\Qt_static
    dort gebt ihr nun ein:

    configure -static -platform win32-g++

    Ihr könnt noch weitere spezifikationen angeben, aber das sind die wichtigen. Weiter könnt ihr über

    configure -h

    abrufen.
    Bestätigt die Frage, ob ihr eine Opensource Software oder Komerzielle entwickelt, und stimmt den Lizensen zu.
    Danach dauert es erstmal so eine halbe bis Stunde. Dann sollte die letzte Ausgabezeile etwas sagen wie,

    ihr könnt jetzt mit mingw32-make Qt erstellen, und wenn ihr das nächste mal eine andere Konfiguration wollt, solltet ihr daran denken vorher ein mingw32-make confclean durchzuführen.

    Wenn so etwas ausgegeben wird, ist alles gut gelaufen, sonst nicht und ihr müsst den Fehler suchen ;)
    Ok und jetzt macht ihr, was die Konsole vorschlägt, Qt statisch erstellen. Das geht über

    mingw32-make sub-src

    Jetzt könnt ich euch ne Pause gönnen, das dauert erstmal ne Weile. So ca 4 Stunden, je nach eurer Konfiguration am Anfang. Man kann es beschleunigen, indem man beispielsweise die Examples nicht mit erstellen lässt.

    Nun ist Qt fertig erstellt und ihr könnt die neue qmake.exe in Qt Creator einbinden.
    Dafür geht ihr auf extras>einstellungen>Erstellung und Ausführung>Qt Versionen.
    Dort auf Hinzufügen. Als Pfad gebt ihr dann die neue qmake.exe an, die im Ordner C:\Qt\Qt_static\bin liegt.
    Danach geht ihr oben auf Kits und sagt Hinzufügen. Wichtig, ihr dürft nicht den oberen Klonen.
    Als Einstellungen wählt ihr:

    Name: Was euch gefällt, z.B. Desktop Qt4.8.4MinGw 32bit static.
    Gerätetyp: Desktop
    Gerät: Lokal ausführen (Vorgabe für Desktop
    Sysroot: nichts
    Compiler: MinGW (x86 32bit in C:\MinGW\bin) | hier nicht den von Qt benutzen!!!
    Debugger: könnt ihr dann automatisch bestimmen lassen. Sollte im Verzeichnis C:\MinGW\bin\gdb.exe gefunden werden.
    Qt-Version: Die von euch eben erstellte.
    Qt-mkspec: nichts.

    Qt wird euch dann ein gelbes Warnzeichen bei dem neuen Kit und der Neuen Version anzeigen, das könnt ihr Ignorieren.
    Und damit seit ihr fertig. Wenn ihr nun ein neues Projekt anlegt, könnt ihr die jeweiligen Kits auswählen, oder sowohl Dynamisch, als auch Static nehmen.
    Dann könnt ihr unten links einstellen, welches Kit genommen wird.

    Falls ihr ein bereits vorhandenes Projekt statisch builden wollt, dann geht ihr in der linke Leiste auf Projekte, wählt oben euer Projekt aus und dann bei Erstellung und Ausführung geht ihr auf Kit hinzufügen, wählt das statische und nun könnt ihr es statisch builden ;)


  • Moderators

    Hallo
    Super, habe gerade dein Tutorial gefunden.

    Es ist mir allerdings nicht klar, warum du nicht einfach einen Update zu dem bestehenden Eintrag gemacht hast.
    Überall wo sich etwas geändert hat, kann man ja einfach einen zusätzlichen Abschnitt einfügen. Oder ist alles anders als in dem ursprünglichen Wiki-Eintrag?



  • Naja ich war mir nicht so ganz sicher, ob man die Schritte vom Wiki doch vieleicht braucht, oder wozu sie gut sind. Schließlich wird der autor sich was dabei gedacht haben oder ;) Daher dachte ich mir erstmal ein neues zu machen, vielleicht gibt es ja jemanden, der sich da besser auskennt wie ich.


  • Moderators

    Naja, denken tut sich meistens jeder etwas ;-)
    Gerolf hat sich mit Sicherheit auch etwas gedacht, allerdings basiert seine Zusammenfassung auf 4.7.4 und es kann sich etwas geändert haben. Mit Sicherheit der MinGW hat sich geändert.
    Auf der anderen Seite führen viele Wege nach Rom :D Gerade bei SW ist das so.

    Deine Versuche mit einem statischen Build von Qt 5.0.2 waren wohl zum Scheitern verurteilt. Für "Qt 5.1 ist folgendes im wiki":http://qt-project.org/wiki/New-Features-in-Qt-5.1#ab851a614e60913de1ec6a6f110159c8 zu finden:
    [quote]
    Other New Features

    Support for Static Qt builds
    [/quote]

    Von einigen wird dies schon als generelle Verfügbarkeit eines statischen Builds gewertet, aber es dreht sich wohl eher um Bugfixes und eine generelle Kompilierbarkeit für statische Libs.



  • Da kann man nur hoffen :D schön wäre es, wenn es von haus aus mit geliefert wird. Aber da es nur für opensource ist, eher unwahrscheinlich.


  • Moderators

    [quote author="QT-static-prgm" date="1372670040"]Da kann man nur hoffen :D schön wäre es, wenn es von haus aus mit geliefert wird. Aber da es nur für opensource ist, eher unwahrscheinlich.

    [/quote]
    Ich weiss es auch nicht, aber aus meiner Sicht wird es nicht einen Prebuild als statische Libs geben. Es ist wohl weniger ein Problem des opensource als ein Interessenskonflikt mit den Lizenzbedingungen.

    Aber alles kommt auf die Strategie von Digia an.



  • Wie gesagt da bleibt nur zu hoffen überig. Hast du ahnung von QT und IActiveDesktop?? habe schon alles prpbiert, aber nichts klappt. Habe auch schon Visual Studio bemüht, aber da gibt es auch fehler


  • Moderators

    [quote author="QT-static-prgm" date="1372673665"]Wie gesagt da bleibt nur zu hoffen überig. Hast du ahnung von QT und IActiveDesktop?? habe schon alles prpbiert, aber nichts klappt. Habe auch schon Visual Studio bemüht, aber da gibt es auch fehler[/quote]
    Nope, keinerlei Erfahrung.



  • Habe es mit der neuen Version probiert. Also Qt 5.1 installiert und dann die libs 4.8.5 static gebuildet. Das Funktioniert genauso wie oben beschrieben


  • Moderators

    [quote author="QT-static-prgm" date="1372956077"]Habe es mit der neuen Version probiert. Also Qt 5.1 installiert und dann die libs 4.8.5 static gebuildet. Das Funktioniert genauso wie oben beschrieben[/quote]

    Wenn man die Meldung richtig interpretiert, sollte es nun auch ohne Porbleme möglich sein mit Qt 5.1 die Libs statisch zu erstellen.


  • Moderators

    Das es keine fertigen static-builds gibt liegt meines Wissens weniger an der Strategie von Digia. Ich sehe persönlich auch keine Probleme mit den Lizenzbedingungen (bin aber kein Anwalt;), da es der Lizenz ja egal ist, ob sie auf Source + prebuilt libs gilt oder für Source + self-built libs.

    Erfahrungsgemäß ist es einfach sehr schwierig, eine Konfiguration anzubieten, die einen großen Querschnitt der User abdeckt. Benutzer statischer Builds sind da nochmal anspruchsvoller mit Blick auf was rein-/rauskonfiguriert wird, welche Defines gesetzt werden, etc. Am Ende ist es wahrscheinlich sehr viel Arbeit sich auf eine Konfiguration zu einigen und trotzdem werden 90% der Leute, die statische Libs wollen selbser bauen.

    Da ist es meiner Meinung nach besser die Zeit in andere Projekte zu stecken.


  • Moderators

    Hallo Tobias
    ich möchte es nicht als Kritik an Digia verstanden wissen.
    Ich bin auch kein Anwalt. Statisches Linken bedeutet aus meiner Sicht die Inanspruchnahme von GPL (d.h. eigner Source ist dann offen) sobald man die Applikationen verteilt an andere. LGPL geht nur mit dynamischen Libs. Oder statischen Libs mit kommerzieller Lizenz sind eine Möglichkeit. So lege ich die Lizenzvereinbarungen aus.

    Daher ist es auch von Digia konsequent nur dynamische Libs als pre-build zur Verfügung zu stellen. Diese gelten für GPL und LGPL.

    Würde Digia auch noch die statischen Libs zur Verfügung stellen, würde Digia ja auch irgendwie Hand zur Verletzung von LGPL bieten. Da könnte irgendein Anwalt vielleicht schon nachhaken. Aber wie schon angemerkt, ich bin auch kein Anwalt. ;-)

    Ein weiterer, zweiter Aspekt wäre dann die Komplexität von statischen Libs für alle möglichen Fälle zu erstellen. Diese Zeit und Serverkapazitäten sind tatsächlich anders besser einzusetzen.

    Das Selberbauen ist beim ersten Mal eine Sache und wird mit der Zeit einfacher. Auch für dynamische Libs ist dies bei einigen Kompilern durchaus notwendig. Leider ist auch hier der Anfang schwer.



  • Hi,

    also ich habe mich bisher noch nicht so damit auseinander gesetzt, und so nur die Grund konfiguration genutzt :D Aber ich fände es schön, wenn man in Qt z.B. die Konfigurationen unter sagen wir mal Einstellungen einstellen kann, und dann beim ersten builden halt die libs gemacht werden. Fände ich viel besser, als 100 Tuts im Inet zu lesen, und nachher passt dann doch nicht alles.

    Übrigens habe ich auch gehört, dass 5.1 statisch builden kann, aber habe es nirgendswo gefunden. Und erlich gesagt, ich glaube nicht, dass die Software dass dann schneller hin bekommt als die Konsole und da ich letztere Variante jetzt gut verstanden habe, habe ich keine Lust mich jetzt wieder damit ausseinander zu setzten.

    Nur eins finde ich etwas m,erkwürdig. Bei ein paar Projecten, die bereits bestanden (Bei neuen habe ich es noch nicht probiert) kann ich nicht mehr dynamisch builden. er meint er hätte QApplications,... also eigentlich alle Qxxxxxx headers nicht gefunden.
    Hat da jemand eine Idee??


  • Moderators

    [quote author="QT-static-prgm" date="1373274266"]
    Nur eins finde ich etwas m,erkwürdig. Bei ein paar Projecten, die bereits bestanden (Bei neuen habe ich es noch nicht probiert) kann ich nicht mehr dynamisch builden. er meint er hätte QApplications,... also eigentlich alle Qxxxxxx headers nicht gefunden.
    Hat da jemand eine Idee??[/quote]
    Du musst beide Versionen der Qt libs auf deiner Maschine haben. Prinzipiell gilt eine Version, wie du sie für statische Libs erstellt hast, als eine Einheit. Das ganze Gesumms sollte auf einem Folder (z.B. Qt_5_0_1_statisch, oder auch Qt484_static) liegen. Der Name dient nur zur eindeutigen Unterscheidung des Builds.
    Falls Du zum Beispiel Qt 4.8.4, das neue Qt 4.8.5 und Qt 5.1.0 mal locker als statisch und dynamisch linken möchtest, braucht das schon etwas Platz auf der Platte. Insgesamt sind dies 6 verschiedene Versionen inklusive qmake und der tools für jede dieser Versionen.
    Diese 6 Versionen würdest du in Qt creator als unterschiedliche "Qt Versionen" einbinden und verwenden.
    Da ist vieles doppelt und dreifach respektive 6-fach vorhanden. Allerdings solltest du nicht einfach Sachen löschen, sonst hast du schnell eine nicht funktionierende Version.

    Ich weiss nicht ob eine "automatische" Erstellung der jeweilig notwendigen Libs direkt über den creator so geschickt ist. Das wird schnell komplex, da es verschiedene Konfigurationsmöglichkeiten gibt. Aus meinder Sicht lohnt sich diese Arbeit nicht. Die Anzahl der tutorials lässt sich damit nicht reduizieren, da du diese zum richtigen Konfigurieren innerhalb des creators brauchst. ;-)
    Weiterhin hast gesehen, dass der gesamte Prozess etwas dauert. So etwas willst du nicht locker einmal kurz ausversehen auslösen ;-)



  • Ja ich habe ja alle libs, dynamisch, static drauf. Sollten zu mindestens.
    Ich habe den Ordner Qt5.1, wo Qt komplett installiert ist. Also mit minGW und libs und qmake,.... alles, was man für das ganz normale halt so braucht, und was bei der Installation von Qt mitgeliefert wird. Und dann habe ich den Ordner Qt4.8.5_static. hier liegen nur die 4.8.5 libs, welche ich dann static gebuildet habe. Sollte also alles gehen oder??


  • Moderators

    Du möchtest Qt 5.1 dynamisch und Qt 4.8.5 statisch verwenden?



  • Ja genau. Unten kann ich dann zwischen dy/st und jeweils debugg/release unterscheiden


  • Moderators

    Ein Problem "könnte das widget include":http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5 sein. Dies muss bei Qt 5 verwendet werden. Ich weiss nicht, wie sich das genau äussert. Habe gerade erst Qt 5.1 installiert, aber noch nicht angefangen meine Libs zu übersetzen.

    [quote author="QT-static-prgm" date="1373278216"]Und dann habe ich den Ordner Qt4.8.5_static. hier liegen nur die 4.8.5 libs, welche ich dann static gebuildet habe. [/quote]
    Da sollten nicht nur die statishcen Libs sein, sondern auch ein bin folder mit qmake und dem Zeugs, sowie ein paar andere folder mit includes, etc. Genauso wie auch auf dem vom Download installierten Qt 5.1 es ein bin, include folder geben sollte.



  • AH jetzt erinnere ich mich :D

    das macht natürlich Sinn. Wenn ich statisch build bekomme ich eine Warnung wegen dem QT += widgets. Daher habe ich es einfach aus der Pro gelöscht, und die Warnung war weg. Für statischz braucht man es scheinbar nicht. Für dynamisch schon :D. Sollte also wieder gehen, wenn ich die Zeile wieder hinzufüge :D

    Werde ich gleich mal ausprobieren


  • Moderators

    Der Unterschied kommt nicht von statisch und dynamisch. Du brauchst widgets für Qt 5. Der Rest ist nur eine zufällige Korrelation.



  • Ah ok. Also ist es vollkommen egal, welche libs man hat??

    Ah ok jetzt geht es :D

    Ich habe gesehen, dass der Creator designer integriert hat, sodass man, wenn man ein neues Projekt anlegt auch innerhalb vom creator mit designer das Fenster ändern kann. Ich habe dann manuel das Window verändert. Doch wurde es leider nicht in der ui Datei geändert, sodass ich jetzt weitere Änderungen nicht im Designer machen kann. Gibt es da eine möglichkeit, meine änderungen in der cpp in die ui zu laden??


  • Moderators

    AFAIK Nein. Da musst nochmals anpassen.



  • und wie geht das?? habe noch nicht wirklich dahinter geblickt, was ich mit dem designer soll. Gibt es dazu auch tuts, wie ich damit umgehe, damit es sinn hat ihn zu benutzen??


  • Moderators

    Mir ist noch kein Tutorial für den Designer untergekommen. Im wiki scheint etwas auf Türkisch(?) zu geben.

    Versuche es am Besten mit einem kleinen Beispiel mal aus. Wenn es dir gefällt, mach weiter damit. Der Designer soll das Aufstellen eines GUIs helfen. Dies funktioniert auch ganz ordentlich.

    Habe kurz mal "google aktiviert,":http://lmgtfy.com/?q=qt+designer+tutorial da gibt es anscheinend doch ein paar externe Sachen. Musst du mal schauen.



  • Vielen Dank werde ich mich mal einlesen. Ich liebe lmgtfy. Es ist viel Informativer wie "Das hier":http://www.giyf.com/


  • Moderators

    LOL :D


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.