Qt-Tutorial Teil 4: Kompilieren und Installation von Software unter Windows
 | 
12.08.2010
 | 
10:41

Qt-Tutorial Teil 4: Kompilieren und Installation von Software unter Windows

Unter Windows ist es sinnvoll, ein Programm in Form eines Installationsprogramms anzubieten. In diesem Teil des Tutorials wird kurz auf das Zusammenspiel zwischen Qt und NSIS eingegangen.

Windows-Ressourcen

Im ersten Teil des Tutorials wurde die Projektdatei für qmake beschrieben. Zur Wiederholung sehen wir uns noch einmal den Windows-spezifischen Teil an:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. win32 {
  2.     message("Baue für Win.")
  3.     #Ressourcen-Referenz (Textdatei)
  4.     RC_FILE = win/myapp.rc
  5. }

Was verbirgt sich hinter der ominösen Ressourcen-Referenz?

Windows-exe-Dateien enthalten neben dem Programmcode sogenannte Ressourcen. Die bekanntesten Vertreter solcher Zusatzinformationen sind die Icons für das Programm. In der Ressourcen-Referenz werden solche Informationen für den Compiler definiert, damit er ein Windows-Programm samt Icons erstellen kann.

Die Ressourcen-Datei sieht im einfachsten Fall z.B. so aus:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. IDI_ICON1               ICON    DISCARDABLE     "win/myIcons.ico"

Die Ressource verweist in diesem Fall auf eine Datei myIcons.ico, welche die Icons für die Applikation bereitstellt. Auf das Erstellen solcher Icon-Dateien unter Windows werde ich hier nicht eingehen – eine einfache Methode bietet beispielsweise das Freeware-Programm SimplyIcon.

Sowohl die Ressources-Datei als auch die Icons liegen im Unterverzeichnis win. Dies muss jedoch nicht so sein, räumt die Entwicklungsumgebung jedoch etwas auf.

Installer mit NSIS erstellen

Ein gutes Windowsprogramm wird mit einem Installer ausgeliefert. Dieser kümmert sich um das Installieren aller relevanten Dateien, sowie später auch um das saubere Löschen, falls das Programm wieder deinstalliert wird.

NSIS (Nullsoft Scriptable Install System) ist einer der populärsten Installer und wird auch im professionellen Bereich oft eingesetzt. NSIS ist Open Source und läuft im Übrigen auch unter Linux und Mac.

NSIS erwartet eine Installationsdatei. Diese ist eine einfache Textdatei mit entsprechenden Anweisungen. Wie diese Anweisungen aufgebaut sind, ist ebenfalls nicht Gegenstand dieses Tutorials – das Internet ist voll mit guten Tutorials zum Thema NSIS. Ein guter Einstieg für die Installation es Qt-Programms ist das folgende Skript:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. !define VERSION "1.0.0"
  2. !define QT "C:\Qt\2010.02.1\qt\bin\"
  3. !define INSTALLATIONNAME "MyApplication"
  4.  
  5. ;--------------------------------
  6. ;Include Modern UI
  7.  
  8.   !include "MUI2.nsh"
  9.  
  10. ;--------------------------------
  11. ;General
  12.  
  13.   ;Name and file
  14.   Name "${INSTALLATIONNAME} ${VERSION}"
  15.   OutFile "MyApplication.exe"
  16.  
  17.   SetCompressor lzma
  18.  
  19.   ;Default installation folder
  20.   InstallDir "$PROGRAMFILES\MyApplication"
  21.  
  22.   ;Get installation folder from registry if available
  23.   InstallDirRegKey HKCU "Software\${INSTALLATIONNAME}" ""
  24.  
  25.   ;Request application privileges for Windows Vista
  26.   !define MULTIUSER_EXECUTIONLEVEL Highest
  27.   !define MULTIUSER_MUI
  28.   !define MULTIUSER_INSTALLMODE_COMMANDLINE
  29.   !include MultiUser.nsh
  30.  
  31. ;--------------------------------
  32. ;Interface Settings
  33.  
  34.   !define MUI_HEADERIMAGE
  35.   !define MUI_HEADERIMAGE_BITMAP "cm_header.bmp"
  36.   !define MUI_HEADERIMAGE_UNBITMAP "cm_un-header.bmp"
  37.   !define MUI_WELCOMEFINISHPAGE_BITMAP "cm_wizard.bmp"
  38.   !define MUI_UNWELCOMEFINISHPAGE_BITMAP "cm_un-wizard.bmp"
  39.   !define MUI_ICON "myIcons.ico"
  40. #  !define MUI_UNICON "unicon.ico"
  41.  
  42.   !define MUI_ABORTWARNING
  43.  
  44.   ;Show all languages, despite user's codepage
  45.   !define MUI_LANGDLL_ALLLANGUAGES
  46.  
  47. ;--------------------------------
  48. ;Language Selection Dialog Settings
  49.  
  50.   ;Remember the installer language
  51.   !define MUI_LANGDLL_REGISTRY_ROOT "SHCTX"
  52.   !define MUI_LANGDLL_REGISTRY_KEY "Software\${INSTALLATIONNAME}"
  53.   !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
  54.  
  55.   ;Start Menu Folder Page Configuration
  56.   !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
  57.   !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${INSTALLATIONNAME}"
  58.   !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
  59.  
  60. ;--------------------------------
  61. ;Pages
  62.   !insertmacro MUI_PAGE_WELCOME
  63.   !insertmacro MUI_PAGE_LICENSE $(license)
  64.   !insertmacro MUI_PAGE_COMPONENTS
  65.   !insertmacro MULTIUSER_PAGE_INSTALLMODE
  66.   !insertmacro MUI_PAGE_DIRECTORY
  67.   !insertmacro MUI_PAGE_INSTFILES
  68.   !insertmacro MUI_PAGE_FINISH
  69.  
  70.   !insertmacro MUI_UNPAGE_WELCOME
  71.   !insertmacro MUI_UNPAGE_CONFIRM
  72.   !insertmacro MUI_UNPAGE_INSTFILES
  73.   !insertmacro MUI_UNPAGE_FINISH
  74.  
  75. ;--------------------------------
  76. ;Languages
  77.  
  78.   !insertmacro MUI_LANGUAGE "English" ;first language is the default Language
  79.   !insertmacro MUI_LANGUAGE "German"
  80.  
  81. ;--------------------------------
  82. ;Reserve Files
  83.  
  84.   ;If you are using solid compression, files that are required before
  85.   ;the actual installation should be stored first in the data block,
  86.   ;because this will make your installer start faster.
  87.  
  88.   !insertmacro MUI_RESERVEFILE_LANGDLL
  89.  
  90. ;--------------------------------
  91. ;Installer Sections
  92.  
  93. Section ""
  94.   SetOutPath $INSTDIR
  95.   File ..\Release\MyApplication.exe
  96.   File ..\*.qm
  97.   File license*.rtf
  98.   File ${QT}mingwm10.dll
  99.   File ${QT}libgcc_s_dw2-1.dll
  100.   File ${QT}QtCore4.dll
  101.   File ${QT}QtGui4.dll
  102.   WriteUninstaller $INSTDIR\uninstall.exe
  103.   WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "DisplayName" "Forth Installer"
  104.   WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "UninstallString" '"$INSTDIR\uninstall.exe"'
  105.   WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoModify" 1
  106.   WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoRepair" 1
  107.   WriteRegStr SHCTX "Software\${INSTALLATIONNAME}" "" $INSTDIR
  108. SectionEnd
  109.  
  110. Section $(startmenu) Startmenu
  111.   CreateDirectory "$SMPROGRAMS\${INSTALLATIONNAME}"
  112.   CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  113.   CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\MyApplication.lnk" "$INSTDIR\MyApplication.exe" "" "$INSTDIR\MyApplication.exe" 0
  114. SectionEnd
  115.  
  116. Section /o $(desktop) Desktop
  117.   CreateShortCut "$DESKTOP\MyApplication.lnk" "$INSTDIR\MyApplication.exe" "" "$INSTDIR\MyApplication.exe" 0
  118. SectionEnd
  119.  
  120. ;--------------------------------
  121. ;Installer Functions
  122.  
  123. Function .onInit
  124.   !insertmacro MULTIUSER_INIT
  125.   !insertmacro MUI_LANGDLL_DISPLAY
  126. FunctionEnd
  127.  
  128. ;--------------------------------
  129. ;Descriptions
  130.  
  131. LicenseLangString license ${LANG_ENGLISH} license.rtf
  132. LicenseLangString license ${LANG_GERMAN} license_de.rtf
  133.  
  134. LangString startmenu ${LANG_ENGLISH} "Add to Start Menu"
  135. LangString startmenu ${LANG_GERMAN} "Eintrag ins Startmenü"
  136. LangString DESC_Startmenu ${LANG_ENGLISH} "Add an Entry to the Start Menu"
  137. LangString DESC_Startmenu ${LANG_GERMAN} "Einen Eintrag ins Startmenü hinzufügen"
  138.  
  139. LangString desktop ${LANG_ENGLISH} "Add a Desktop Icon"
  140. LangString desktop ${LANG_GERMAN} "Zum Desktop hinzufügen"
  141. LangString DESC_Desktop ${LANG_ENGLISH} "Add an Icon to the Desktop"
  142. LangString DESC_Desktop ${LANG_GERMAN} "Einen Eintrag zum Desktop hinzufügen"
  143.  
  144. !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  145.    !insertmacro MUI_DESCRIPTION_TEXT ${Startmenu} $(DESC_Startmenu)
  146.    !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} $(DESC_Desktop)
  147. !insertmacro MUI_FUNCTION_DESCRIPTION_END
  148.  
  149. ;--------------------------------
  150. ;Uninstaller Section
  151.  
  152. Section "Uninstall"
  153.   DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}"
  154.   DeleteRegKey SHCTX "Software\${INSTALLATIONNAME}"
  155.   Delete $INSTDIR\uninstall.exe
  156.   Delete $INSTDIR\MyApplication.exe
  157.   Delete $INSTDIR\*.qm
  158.   Delete $INSTDIR\license*.rtf
  159.   Delete $INSTDIR\mingwm10.dll
  160.   Delete $INSTDIR\libgcc_s_dw2-1.dll
  161.   Delete $INSTDIR\QtCore4.dll
  162.   Delete $INSTDIR\QtGui4.dll
  163.   RMDir $INSTDIR
  164.   Delete "$SMPROGRAMS\${INSTALLATIONNAME}\Uninstall.lnk"
  165.   Delete "$SMPROGRAMS\${INSTALLATIONNAME}\MyApplication.lnk"
  166.   Delete "$DESKTOP\MyApplication.lnk"
  167.   RMDir "$SMPROGRAMS\${INSTALLATIONNAME}"
  168. SectionEnd
  169.  
  170. ;--------------------------------
  171. ;Uninstaller Functions
  172.  
  173. Function un.onInit
  174.   !insertmacro MULTIUSER_UNINIT
  175.   !insertmacro MUI_UNGETLANGUAGE
  176. FunctionEnd

Das Skript liegt, wie die anderen Windows-spezifischen Dateien, im Verzeichnis win.

Die wichtigsten Einstellungen befinden sich gleich am Anfang: Die Variable QT definiert den Ort, an dem sich die Qt-Binärdaten befinden (Qt Creator und Co.). Von dort muss der Installer einige DLLs kopieren (s.u.).

Wir verwenden die  NSIS-Skin „Modern UI”, die wesentlich schöner ist als das Standardaussehen des Installers. Im Win-Verzeichnis müssen daher 4 Bitmap-Dateien liegen, die in Zeile 35–38 definiert wurden. Dabei handelt es sich um Grafiken für den Installer. Die Header sind dabei 150x57 Pixel groß, die Wizard-Bilder 164x314px. Die Bild er sind optional. NSIS verwendet Standardbilder, falls keine angegeben wurden.

In Zeile 26–29 bestimmen wir, dass die Installation ggf. mit Superuser-Rechten ausgeführt werden muss. Das ist bei neueren Windows-Versionen (Vista, Windows 7) zwingend notwendig, wenn man Dateien in die Programmverzeichnisse kopieren will.

Zeilen 62–73 definieren den Installations- bzw. Deinstallationsdialog. Auch hier kann man bei Bedarf die Reihenfolge ändern oder bestimmte Punkte weglassen (z.B. Lizenzvereinbarung).

Interessant wird es in der Standardsektion des Installers (ab Zeile 93): Hier wird festgelegt, welche Dateien installiert werden, bzw. welche Dateien im Installer integriert werden. Für Qt-Programme sind folgende Dateien notwendig:

  • exe-Datei aus dem Release-Verzeichnis
  • mögliche Sprachdateien für Qt (Endung qm)
  • Ressourcen für das Programm sowie den Installer (im Beispiel z.B. die Lizenztexte im RTF-Format)
  • QT-DLLs – Essentiell, da das Programm sonst nicht ausführbar ist! Die im Beispiel gezeigten sind die Bibliotheken, die auf jeden Fall integriert werden müssen, wenn man den Qt-Creator und GCC als Compiler verwendet (deshalb die mingwm-DLL). Wird mit dem Compiler von Visual Studio gearbeitet, muss eine andere DLL eingebunden werden (steht in der Qt-Anleitung für Windows). Verwendet man weitere Qt-Module (z.B. Webkit oder Netzwerkklassen), müssen die dazugehörigen DLL-Dateien auch eingebunden werden.
  • Registry-Einträge für den Uninstaller
  • ggf. Einträge ins Startmenü und/oder auf den Desktop

Damit sind die wesentlichen Schritte getätigt. Wesentlich ist, dass die richtigen DLLs ausgewählt und im Installer verpackt werden. Nur so kann ein Qt-Programm ausgeführt werden – dies bedeutet aber auch gleichzeitig, dass die Größe der installierten Daten gewaltig wächst! QtCore4.dll und QtGui4.dll haben eine Größe von zusammen etwa 6 MB.

Beim Deinstallieren müssen natürlich alle Dateien gelöscht werden.

  •  
  • 0 Kommentare
  •  
Mein Kommentar
Ich möchte über jeden weiteren Kommentar benachrichtigt werden.

Zurück