English German
Table of Content
Wie baue ich Qt als statische Library für Windows mit gcc
Diese Anlkeitung beschreibt den Weg, den ich gegangen biun und der bei mir funktioniert. Ich hoffe, es hilft euch ein wenig.
Vorbereitung
Al erstes lädt man das Qt SDK herunter, das man nehmen will und istalliert es (ich benutze 4.7.0 incl. MinGW). Dann kopiert man den kompletten Dateibau des Verzeichnisses qt (Qt-SDK-Pfad\qt) in ein neues Verzeichnis (Qt-SDK-Pfad\qt-static).
Die Datei Qt-SDK-Pfad\bin\qtenv.bat wird in den neuen Ordner kopiert (Qt-SDK-Pfad\qt-static) und dort bearbeitet:
—> ersetze Qt-SDK-Pfad\qt mit Qt-SDK-Pfad\qt_static
Bereinigen der Verzeichnisse
Das source Verzeichniss beinhaltet noch einige Dateien und Verzeichnisse, die beim bauen mit anderen Éunstellungen manchmal stören. Deswegen müssen die folgenden Dateien / Verzeichnisse innerhalb von Qt-SDK-Pfad\qt_static gelöscht werden:
- Alle Verzeichnisse mit namen tmp innerhalb von Qt-SDK-Pfad\qt_static
- Alle Dateien in Qt-SDK-Pfad\qt_static\lib\, außer Readme und dem Verzeichniss Fonts
- Alle Dateien (*.exe, *.dll) innerhlb des Pfades Qt-SDK-Pfad\qt_static\bin
- Alle Dateien mit folgendem Namen innerhalb Qt-SDK-Pfad\qt_static: Makefile, Makefile.debug, Makefile.release. Keine anderen Makefiles löschen.
Editieren der Konfiguration für den statischen build:
Jetzt müssen einige Konfiguratiuonsdateien editiert werden, damit der statische build funktioniert und damit die mingw c – libraries auch statisch gelinkt werden:
- In der Datei Qt-SDK-Pfad\qt_static\mkspecs\win32-g++\qmake.conf müssen die folgenden, fett markierten (oder mit stern markierten) Änderungen gemacht werden:
- QMAKE_CFLAGS_RELEASE = -Os -momit-leaf-frame-pointer
- QMAKE_LFLAGS = -static -static-libgcc …
- DEFINES += QT_STATIC_BUILD
- In der Datei Qt-SDK-Pfad\qt_static\qmake\Makefile.win32-g++ müssen die folgenden, fett markierten (oder mit stern markierten) Änderungen gemacht werden:
- LFLAGS = -static -static-libgcc …
- In der Datei Qt-SDK-Pfad\qt_static\src\3rdparty\webkit\WebKit.pri müssen die folgenden, fett markierten (oder mit stern markierten) Änderungen gemacht werden:
- CONFIG += staticlib ganz oben einfügen.
Erstellen der statischen Qt Version
- Öffne eine Komandozeile und gehe zu folgendem Pfad: Qt-SDK-Pfad\qt_static
- führe qtenv.bat aus.
- Starte configure.exe mit den benötigten parametern (min -static). Ich benutze:
- configure.exe -static -debug-and-release -opensource -confirm-license -platform win32-g++ -no-exceptions -dont-process -no-qt3support -webkit -qt-sql-sqlite -qt-zlib -qt-libpng -qt-libjpeg
- Die wichtigsten sind: * -static -platform win32-g++ -no-exceptions*
- Nun müssen die makefiles erzeugt werden (nur für die libraries, nicht für die Tools):
- bin\qmake.exe projects.pro QT_BUILD_PARTS=“libs” JAVASCRIPTCORE_JIT=“yes”
- Jetzt kann Qt gebaut werden:
- mingw32-make.exe
- geh einen Kaffe trinken, das dauert eiune Weile. Auf meinem Computer (Laptop mit Intel Core2 Duo T7700 2,4 GHz, 2 GB RAM, Windows 7 Professional, 32 Bit) waren es 3 Stunden.
Sonstiges
Ich rate davon ab, die Tools (designer, assistant, etc.) auch zu bauen, da QtCreator die meisten bereits im Bauch hat. Wenn umbedingt tools benötigt werden (wie lrelease, lupdate), benutzt die aus der dynamischen Version (Qt-SDK-Pfad\qt). Im Zweifelsfall kopiert sie von dort in das bin Verzeichnis der statischen Version (incl. der benötigten dlls).
Optimierungen
Da die Executables teilweise sehr groß werden können, empfielt es sich, sie mittels eines executable Packers etwas kleiner zu machen. Hier empfielt sich z.B. upx [upx.sourceforge.net] (http://upx.sourceforge.net).
Wie integriere ich die statische Qt version in den QtCreator
Öffne QtCreator un gehe zum Menü Extras / Optionen. Wähle den reiter Qt4:
Durch Drücken des Plus Knopfes eine neue Qt version hinzufügen
Namen und Pfad zu qmake eingeben (Qt-SDK-Pfad\qt_static\bin\qmake.exe)
MinGW Verzeichnis eingeben (von 4.7.0 kopieren)

Wenn man ein neues Projekt erzeugt, die Frage nach der Qt Version mit allen Versionen (4.7.0 / 4.7.0 static) beantworten.

Wenn bereits ein Projekt existiert, dieses öffnen und dann die Option Projekt auswählen (linke Schnellwahl im QtCreator) und eine einstellung hinzufügen.

Um das Projekt als statisch und dynamisch gelinkt bauen zu können, sollte bei den statischenProjekteinstellkungen folgendes hinzugefügt werden: CONFIG+=static
Dazu muss man die Projekteinstellungen öffnen, und bei qmake auf Details klicken. Unter Unter Zusätzliche Argumente, folgendes hinzufügen: CONFIG+=static

In der qmake Projekt Datei (*.pro) muss folgendes hinzugefügt werden:
- static { # everything below takes effect with CONFIG += static
- CONFIG += static
- CONFIG += staticlib # this is needed if you create a static library, not a static executable
- DEFINES += STATIC
- message("~~~ static build ~~~") # this is for information, that the static build is done
- mac: TARGET = $$join(TARGET,,,_static) #this adds an _static in the end, so you can seperate static build from non static build
- win32: TARGET = $$join(TARGET,,,s) #this adds an s in the end, so you can seperate static build from non static build
- }
Wenn für die debug Version ein d am Ende des binary Dateinamen seien soll, wird noch folgendes benötigt:
- # change the nama of the binary, if it is build in debug mode
- CONFIG(debug, debug|release) {
- mac: TARGET = $$join(TARGET,,,_debug)
- win32: TARGET = $$join(TARGET,,,d)
- }
Das wars. Jetzt kann das Projekt statisch oder dynamisch gelinkt werden.

