How to build a static Qt version for Windows with gcc/de

From Qt Wiki
Jump to: navigation, search
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Th Tr Uk Zh

Wie baue ich Qt als statische Library für Windows mit gcc

Diese Anleitung beschreibt den Weg, den ich gegangen bin und der bei mir funktioniert. Ich hoffe, es hilft euch ein wenig.

Vorbereitung

Als erstes lädt man das Qt SDK herunter, das man nehmen will und installiert 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 Verzeichnis beinhaltet noch einige Dateien und Verzeichnisse, die beim Bauen mit anderen Einstellungen 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 Verzeichnis 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 Konfigurationsdateien 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+.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

  1. Öffne eine Komandozeile und gehe zu folgendem Pfad: Qt-SDK-Pfad\qt_static
  2. führe qtenv.bat aus.
  3. 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*

  1. 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"
  1. Jetzt kann Qt gebaut werden:
  • mingw32-make.exe
  • geh einen Kaffe trinken, das dauert eine 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 unbedingt 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 (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:

Select Options - Qt4 - Add

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)
Changes in the settings

Wenn man ein neues Projekt erzeugt, die Frage nach der Qt-Version mit allen Versionen (4.7.0 / 4.7.0 static) beantworten. Neues Projekt anlegen Wenn bereits ein Projekt existiert, dieses öffnen und dann die Option Projekt auswählen (linke Schnellwahl im QtCreator) und eine Einstellung hinzufügen. Projekteinstellungen ändern Um das Projekt als statisch und dynamisch gelinkt zu erstellen, sollte bei den statischen Projekteinstellkungen folgendes hinzugefügt werden: CONFIG+=static Dazu muss man die Projekteinstellungen öffnen, und bei qmake auf Details klicken. Unter Zusätzliche Argumente, folgendes hinzufügen: CONFIG+=static Modifizierter qmake step

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("[[User:Maintenance script|Maintenance script]] ([[User talk:Maintenance script|talk]]) static build [[User:Maintenance script|Maintenance script]] ([[User talk:Maintenance script|talk]])") # 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.