Im ersten Teil des Tutorials ging es um Einstellungen in der Projektdatei von Qt. In diesem Teil wird die main-Funktion behandelt und wie sie für verschiedene Betriebssysteme fit gemacht werden kann.

Verzeichnispfade und…

Zunächst etwas Theorie: Wie verhalten sich verschiedene Betriebssysteme in Bezug auf Pfade, in denen verschiedene Programmelemente installiert werden sollen?

Microsoft Windows

Unter Windows gibt es wenige Vorgaben, was die Programminstallation betrifft. Programme werden in der Regel unter C:\Programme, C:\Program Files oder C:\Program Files (x86) abgelegt. Installationsprogramme, wie NSIS, sorgen für die korrekte Registrierung installierter Komponenten. Für die De-Installation sind ebenfalls eigene Programme notwendig – die meisten Installationsprogramme installieren deshalb eigene Deinstaller.

Die gesamten Dateien eines Programms werden unter Windows meistens in einem Verzeichnis des Programmordners gespeichert. Dies macht für Qt die Installation eigentlich recht einfach: Alles wird im Pfad der exe-Datei gespeichert, bzw. in Unterordnern.

Beispiel: MeinProgramm.exe wird unter C:\Programme\MeinProgramm\MeinProgramm.exe gespeichert. Qt-Übersetzungsdateien, LiesMich-Dateien und die Programmhilfe werden ebenfalls dort abgelegt. In unserem Fall gehen wir davon aus, dass die Übersetzungen zum Programm im Ordner C:\Programme\MeinProgramm liegen, die Programmhilfe unter c:\Programme\MeinProgramm\help.

Apple Macintosh (Mac OSX)

Das Apple-Betriebssystem kennt mehrere Arten von Programmtypen. Der einfachste ist das sogenannte Application Bundle. Technisch handelt es sich eigentlich lediglich um einen Ordner, der die Endung .app verpasst bekommt. Unterhalb dieses Ordnern werden Dateien und Unterordner nach bestimmten Kriterien verteilt. Die ausführbare Datei befindet sich beispielsweise in einem Unterverzeichnis namens Contents/MacOS.

Für den Qt-Programmierer stellt diese Struktur eine gewisse Herausforderung dar, da die Hilfe- und Übersetzungsdateien in einem anderen Verzeichnis liegen als die ausführbare Datei. Apple stellt in seinen CoreFoundation-Klassen Funktionen für Bundles zur Verfügung.

Apple Application Bundles kennen weder Installation noch De-Installation.

Beispiel: Für MeinProgramm wird das Verzeichnis MeinProgramm.app erstellt, welches das Verzeichnis Contents enthält. Darunter befinden sich die Verzeichnisse MacOS, Resources und Frameworks. Zu Frameworks und anderen Dateien im weiteren Verlauf noch mehr. Die Übersetzungs- und Hilfsdateien kommen in den Ordner MeinProgramm.app/Contents/Resources bzw. MeinProgramm.app/Contents/Resources/help.

Linux und Unixe

Linux (und die meisten anderen unixoiden Systeme mit Ausnahme von Apple) folgen dem Filesystem Hierarchy Standard. Dieser legt fest, welche Systemressourcen wo abgelegt werden sollen. Nicht-systemkritische ausführbare Dateien kommen beispielsweise ins Verzeichnis /usr/bin. Die Programmhilfe kommt ins Verzeichnis /usr/share/doc, allgemeine Unterstützungsdateien in /usr/lib. Alternativ kommt auch der Verzeichnisbaum unter /usr/local in Frage, je nachdem ob die Dateien lokal oder im Rahmen eines Paketmanagers installiert werden sollen. Auch ein Bundle unter /opt/ ist denkbar, aber in den meisten Fällen eher eine Notlösung.

Für den Programmierer von Qt ist dies Fluch und Segen zugleich. Unter einem Linux-System kann er oder sie davon ausgehen, dass sich die Hilfedateien in einem bestimmten absoluten Pfad befinden. Allerdings muss Qt dies natürlich wissen – ähnlich wie bei Mac muss daher das Programm bereits zur Compile-Zeit entsprechend dressiert werden.

Pfadabhängige main-Funktion

Zunächst einmal das Beispielprogramm. Erklärungen folgen weiter unten:

„MyProg” muss natürlich an den eigenen Programmnamen angepasst werden. Statt iostream für die Ausgabe kann auch die Qt-eigenen Debug-Methodik benutzt werden, das ist Geschmacksache.

Bei den Includes sieht man, dass für den Mac eigene Header eingebunden werden (Z. 9–12). Zum Kompilieren ist hier demnach auch XCode notwendig, für das wiederum ein Entwickler-Konto bei Apple eingerichtet werden muss, das man nur bekommt, wenn man einen Mac-Login hat (Mac zeigt sich Entwicklern und Usern gegenüber  leider recht faschistisch). Hat man das auf seinem Mac installiert, klappt das Kompilieren problemlos.

Die eigentlich interessanten Stellen in der main-Funktion sind die Zeilen 43 bis 62. Hier wird der Pfad für die Übersetzungsdateien festgelegt. Bei einem Mac werden die CoreFoundation-Classes dafür verwendet, um den absoluten Pfad des Bundles zu bestimmen. Der Pfad ergibt sich aus diesem absoluten Pfad plus /Contents/Resources/.

Für Linux und Windows ist die Bestimmung des Pfades für die Übersetzungsdateien einfacher: In ersterem Fall haben wir bereits im Teil 1 des Tutorials den Pfad auf /usr/lib/myprog/ mit Hilfe einer Präporzessorkonstante festgesetzt. Bei Windows wird der Pfad einfach relativ angegeben  – der String path ist demnach einfach leer.

Pfade für Hilfedateien

Die Pfade für die Onlinehilfe des Programms oder weitere für das Programm relevante Daten werden im Prinzip in gleicher Weise aufgerufen. Lediglich die Pfade müssen etwas angepasst werden. Deshalb wird auf eine detaillierte Ausführung des Programmcodes an dieser Stelle verzichtet.