How to build a static Qt version for Windows with gcc/de: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
mNo edit summary
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[How to build a static Qt version for Windows with gcc|English]] '''German'''
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}


=Wie baue ich Qt als statische Library für Windows mit gcc=
{{LangSwitch}}


Diese Anlkeitung beschreibt den Weg, den ich gegangen biun und der bei mir funktioniert. Ich hoffe, es hilft euch ein wenig.
[[Category:Developing with Qt::General]]
[[Category:HowTo]]
[[Category:Tools::QtCreator]]


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


Al erstes lädt man das Qt <span class="caps">SDK</span> 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-<span class="caps">SDK</span>-Pfad\qt) in ein neues Verzeichnis (Qt-<span class="caps">SDK</span>-Pfad\qt-static).<br /> Die Datei Qt-<span class="caps">SDK</span>-Pfad\bin\qtenv.bat wird in den neuen Ordner kopiert (Qt-<span class="caps">SDK</span>-Pfad\qt-static) und dort bearbeitet: —&gt; ersetze Qt-<span class="caps">SDK</span>-Pfad\qt mit Qt-<span class="caps">SDK</span>-Pfad\qt_static
Diese Anleitung beschreibt den Weg, den ich gegangen bin und der bei mir funktioniert. Ich hoffe, es hilft euch ein wenig.


==Bereinigen der Verzeichnisse==
== Vorbereitung ==


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-<span class="caps">SDK</span>-Pfad\qt_static gelöscht werden:
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


* Alle Verzeichnisse mit namen tmp innerhalb von Qt-<span class="caps">SDK</span>-Pfad\qt_static
== Bereinigen der Verzeichnisse ==
* Alle Dateien in Qt-<span class="caps">SDK</span>-Pfad\qt_static\lib\, außer Readme und dem Verzeichnis Fonts
* Alle Dateien (*.exe, *.dll) innerhlb des Pfades Qt-<span class="caps">SDK</span>-Pfad\qt_static\bin
* Alle Dateien mit folgendem Namen innerhalb Qt-<span class="caps">SDK</span>-Pfad\qt_static: Makefile, Makefile.debug, Makefile.release. Keine anderen Makefiles löschen.


==Editieren der Konfiguration für den statischen build:==
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.


Jetzt müssen einige Konfigurationsdateien editiert werden, damit der statische build funktioniert und damit die mingw c – libraries auch statisch gelinkt werden:
== Editieren der Konfiguration für den statischen build: ==


* In der Datei Qt-<span class="caps">SDK</span>-Pfad\qt_static\mkspecs\win32-g++\qmake.conf müssen die folgenden, fett markierten (oder mit stern markierten) Änderungen gemacht werden:
Jetzt müssen einige Konfigurationsdateien editiert werden, damit der statische build funktioniert und damit die mingw c - libraries auch statisch gelinkt werden:
** <span class="caps">QMAKE</span>_CFLAGS_RELEASE = '''-Os -momit-leaf-frame-pointer'''
* 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:
** <span class="caps">QMAKE</span>_LFLAGS = '''-static -static-libgcc''' …
'''''' QMAKE_CFLAGS_RELEASE = '''-Os -momit-leaf-frame-pointer'''
** <span class="caps">DEFINES</span> += '''QT_STATIC_BUILD'''
'''''' QMAKE_LFLAGS = '''-static -static-libgcc''' …
* In der Datei Qt-<span class="caps">SDK</span>-Pfad\qt_static\qmake\Makefile.win32-g++ müssen die folgenden, fett markierten (oder mit stern markierten) Änderungen gemacht werden:
'''''' DEFINES''= '''QT_STATIC_BUILD'''
** <span class="caps">LFLAGS</span> = '''-static -static-libgcc''' …
* 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:
* In der Datei Qt-<span class="caps">SDK</span>-Pfad\qt_static\src\3rdparty\webkit\WebKit.pri müssen die folgenden, fett markierten (oder mit stern markierten) Änderungen gemacht werden:
'''''' LFLAGS = '''-static -static-libgcc''' …
** '''<span class="caps">CONFIG</span> += staticlib''' ganz oben einfügen.
* 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==
== Erstellen der statischen Qt Version ==
 
# Öffne eine Komandozeile und gehe zu folgendem Pfad: Qt-SDK-Pfad\qt_static
# Öffne eine Komandozeile und gehe zu folgendem Pfad: Qt-<span class="caps">SDK</span>-Pfad\qt_static
# führe qtenv.bat aus.
# führe qtenv.bat aus.
# Starte configure.exe mit den benötigten Parametern (min -static). Ich benutze:
# 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
* 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*
''' 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):
# 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” <span class="caps">JAVASCRIPTCORE</span>_JIT=“yes”
* bin\qmake.exe projects.pro QT_BUILD_PARTS="libs" JAVASCRIPTCORE_JIT="yes"
#* Jetzt kann Qt gebaut werden:
# Jetzt kann Qt gebaut werden:
#* mingw32-make.exe
* 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 <span class="caps">RAM</span>, Windows 7 Professional, 32 Bit) waren es 3 Stunden.
* 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 ==


==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).


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-<span class="caps">SDK</span>-Pfad\qt). Im Zweifelsfall kopiert sie von dort in das bin Verzeichnis der statischen Version (incl. der benötigten dlls).
== Optimierungen ==


==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. [http://upx.sourceforge.net upx] (http://upx.sourceforge.net).


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. [http://upx.sourceforge.net upx] ''[upx.sourceforge.net]'' (http://upx.sourceforge.net).
= Wie integriere ich die statische Qt version in den QtCreator =


=Wie integriere ich die statische Qt version in den QtCreator=
Öffne QtCreator un gehe zum Menü Extras / Optionen. Wähle den Reiter Qt4:
[[Image:http://lh6.ggpht.com/_m1PNLlZctqY/TPkPz5RZzzI/AAAAAAAAABI/MnKODV6mfNs/s640/Options.jpg|Select Options - Qt4 - Add]]


Öffne QtCreator un gehe zum Menü Extras / Optionen. Wähle den reiter Qt4: [[Image:Options.jpg|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)
[[Image:http://lh4.ggpht.com/_m1PNLlZctqY/TPkP0ABWgJI/AAAAAAAAABM/coniya1Bqs8/s640/Options2.jpg|Changes in the settings]]


Durch Drücken des Plus Knopfes eine neue Qt version hinzufügen Namen und Pfad zu qmake eingeben (Qt-<span class="caps">SDK</span>-Pfad\qt_static\bin\qmake.exe) MinGW Verzeichnis eingeben (von 4.7.0 kopieren) [[Image:Options2.jpg|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.
[[Image:http://lh4.ggpht.com/_m1PNLlZctqY/TPkPz6SLwzI/AAAAAAAAABE/HlpDXpa4UgU/s640/NewProject.jpg|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.
[[Image:http://lh4.ggpht.com/_m1PNLlZctqY/TPkP0aU1cLI/AAAAAAAAABQ/vJwJ8FsuToA/s640/Projects_details.jpg|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'''
[[Image:http://lh5.ggpht.com/_m1PNLlZctqY/TPkQ_DmTqkI/AAAAAAAAABg/JfY90Q-xXRU/s640/Projects_details2.jpg|Modifizierter qmake step]]


Wenn man ein neues Projekt erzeugt, die Frage nach der Qt Version mit allen Versionen (4.7.0 / 4.7.0 static) beantworten. <br />[[Image:NewProject.jpg|Neues Projekt anlegen]]<br /> Wenn bereits ein Projekt existiert, dieses öffnen und dann die Option Projekt auswählen (linke Schnellwahl im QtCreator) und eine einstellung hinzufügen.<br />[[Image:Projects_details.jpg|Projekteinstellungen ändern]]<br /> Um das Projekt als statisch und dynamisch gelinkt zu erstellen, sollte bei den statischen Projekteinstellkungen folgendes hinzugefügt werden: <span class="caps">CONFIG</span>+=static<br /> Dazu muss man die Projekteinstellungen öffnen, und bei qmake auf Details klicken. Unter Zusätzliche Argumente, folgendes hinzufügen: '''<span class="caps">CONFIG</span>+=static'''<br />[[Image:Projects_details2.jpg|Modifizierter qmake step]]
In der qmake Projekt Datei (*.pro) muss folgendes hinzugefügt werden:
<code>
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
}
</code>


In der qmake Projekt Datei (*.pro) muss folgendes hinzugefügt werden:<br />
Wenn für die debug Version ein d am Ende des binary Dateinamen seien soll, wird noch folgendes benötigt:


Wenn für die debug Version ein d am Ende des binary Dateinamen seien soll, wird noch folgendes benötigt: <br />
<code>
# 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)
}
</code>


Das wars. Jetzt kann das Projekt statisch oder dynamisch gelinkt werden.
Das wars. Jetzt kann das Projekt statisch oder dynamisch gelinkt werden.
===Categories:===
* [[:Category:Developing-with-Qt|Developing with Qt]]
** [[:Category:Developing-with-Qt::General|General]]
* [[:Category:German|German]]
* [[:Category:HowTo|HowTo]]
* [[:Category:Tools|Tools]]
** [[:Category:Tools::QtCreator|QtCreator]]

Latest revision as of 09:42, 17 May 2017

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 Sq 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.