Auf dieser Seite

Qt für macOS – Bereitstellung

Dieses Dokument beschreibt, wie Sie ein macOS-Bundle erstellen und sicherstellen, dass die Anwendung zur Laufzeit die benötigten Ressourcen findet. Wir veranschaulichen die Vorgehensweise anhand der Bereitstellung der Beispielanwendung „Plug & Paint“, die im Qt-Quellpaket enthalten ist.

Die Qt-Installationsprogramme für macOS enthalten ein Bereitstellungstool, das die hier beschriebenen Schritte automatisiert.

Das Bundle

Unter macOS muss eine GUI-Anwendung aus einem Bundle heraus erstellt und ausgeführt werden. Ein Bundle ist eine Verzeichnisstruktur, die im Finder als eine Einheit angezeigt wird. Ein Anwendungs-Bundle enthält in der Regel die ausführbare Datei und alle benötigten Ressourcen. Hier ist eine Übersicht über die Struktur eines Anwendungs-Bundles:

Struktur eines macOS-App-Bundles mit dem Ordner „Contents“, der die Unterordner „Frameworks“, „macOS“, „Resources“, „PlugIns“ sowie Konfigurationsdateien enthält

Das Bundle bietet dem Benutzer zahlreiche Vorteile:

  • Es lässt sich leicht installieren, da es als eine Einheit erkannt wird.
  • Auf Informationen über ein Bundle kann aus dem Code heraus zugegriffen werden.

Dies gilt speziell für macOS und würde den Rahmen dieses Dokuments sprengen. Weitere Informationen zu Bundles finden Sie auf der Entwickler-Website von Apple.

Um Ihre Anwendung mit CMake als Bundle zu erstellen, setzen Sie die MACOSX_BUNDLE Eigenschaft für Ihr ausführbares Ziel:

set_target_properties(plugandpaint PROPERTIES
    MACOSX_BUNDLE TRUE
)

qmake generiert automatisch ein Bundle für Ihre Anwendung. Um dies zu deaktivieren, fügen Sie die folgende Anweisung in die Projektdatei Ihrer Anwendung (.pro) ein:

CONFIG-=app_bundle

Statische Verknüpfung

Wenn Sie es einfach halten möchten und nur wenige Dateien bereitstellen müssen, können Sie Ihre Anwendung mit statisch verknüpften Bibliotheken erstellen.

Statisches Erstellen von Qt

Installieren Sie zunächst eine statische Version der Qt-Bibliothek. Beachten Sie, dass Sie keine Plugins verwenden können und dass Sie die abhängigen Bibliotheken wie Bildformate, SQL-Treiber usw. bei der statischen Verknüpfung selbst erstellen müssen.

cd /path/to/Qt
./configure -static <other parameters>

Sie können die verschiedenen verfügbaren Optionen überprüfen, indem Sie den Befehl „ configure -help “ ausführen.

Die Anwendung mit der statischen Version von Qt verknüpfen

Sobald Qt statisch kompiliert ist, besteht der nächste Schritt darin, die Build-Dateien neu zu generieren und die Anwendung neu zu kompilieren.

Verwendung von CMake

Achten Sie darauf, den Wrapper-Befehl „ qt_add_executable “ zu verwenden, der zusätzliche Funktionen bereitstellt, wie zum Beispiel das Verknüpfen von Qt-Plugins in statischen Qt-Builds.

Um für Apple-Plattformen zu kompilieren, müssen Sie ` cmake_minimum_required() ` auf 3.21.1 oder neuer setzen:

cmake_minimum_required(VERSION 3.21.1)

Wechseln Sie in das Verzeichnis, das die Anwendung enthält:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

Setzen Sie anschließend die Variable „ CMAKE_PREFIX_PATH “ so, dass sie auf Ihr Installationspräfix verweist. Falls bereits ein CMake-Build vorhanden ist, löschen Sie die Datei „ CMakeCache.txt “. Führen Sie anschließend CMake erneut aus:

cmake -DCMAKE_PREFIX_PATH=path/to/Qt/6.12.0/your_platform -S <source-dir> -B <build-dir> -G Ninja

Alternativ können Sie das Hilfsskript „ qt-cmake “ verwenden, das die Variable „ CMAKE_PREFIX_PATH “ für Sie setzt.

path/to/Qt/6.12.0/your_platform/bin/qt-cmake -S <source-dir> -B <build-dir> -G Ninja

Wechseln Sie abschließend in Ihr Build-Verzeichnis und führen Sie Ihr bevorzugtes Build-System aus. In diesem Beispiel verwenden wir „ Ninja “.

cd path/to/build/dir
ninja

Sofern nun alles fehlerfrei kompiliert und verknüpft wurde, sollte Ihnen ein „ plugandpaint.app “-Bundle zur Bereitstellung zur Verfügung stehen. Versuchen Sie, das Bundle auf einem Rechner mit macOS zu installieren, auf dem weder Qt noch Qt-Anwendungen installiert sind.

Verwendung von qmake

Wechseln Sie zunächst in das Verzeichnis, das die Anwendung enthält:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

Führen Sie anschließend ` qmake ` aus, um ein neues Makefile für die Anwendung zu erstellen, und führen Sie einen „clean build“ durch, um die statisch verknüpfte ausführbare Datei zu erstellen:

make clean
qmake -config release
make

Wahrscheinlich möchten Sie die Anwendung gegen die Release-Bibliotheken verknüpfen; dies können Sie beim Aufruf von ` qmake` angeben. Möglicherweise möchten Sie die Funktion „Dead Code Stripping“ nutzen, um die Größe Ihrer Binärdatei noch weiter zu reduzieren. Dazu übergeben Sie zusätzlich zum Parameter ` -config release ` den Parameter ` LIBS+= -dead_strip ` an ` qmake `.

Sofern alles fehlerfrei kompiliert und verknüpft wurde, sollten Sie nun über ein plugandpaint.app -Bundle verfügen, das zur Bereitstellung bereit ist. Versuchen Sie, das Bundle auf einem Rechner mit macOS zu installieren, auf dem weder Qt noch Qt-Anwendungen installiert sind.

Überprüfen der verknüpften Bibliotheken

Mit dem Befehl „ otool “ können Sie überprüfen, mit welchen anderen Bibliotheken Ihre Anwendung verknüpft ist:

otool -L plugandpaint.app/Contents/MacOs/plugandpaint

So sieht die Ausgabe für das statisch verknüpfte „Plug & Paint“ aus:

plugandpaint.app/Contents/MacOS/plugandpaint:
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
        (compatibility version 2.0.0, current version 128.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime
        (compatibility version 1.0.0, current version 10.0.0)
/usr/lib/libz.1.dylib
        (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
        (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libstdc++.6.dylib
        (compatibility version 7.0.0, current version 7.3.0)
/usr/lib/libgcc_s.1.dylib
        (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libmx.A.dylib
        (compatibility version 1.0.0, current version 92.0.0)
/usr/lib/libSystem.B.dylib
        (compatibility version 1.0.0, current version 88.0.0)

Wenn in der Ausgabe Qt-Bibliotheken aufgeführt sind, bedeutet dies wahrscheinlich, dass auf Ihrem Rechner sowohl dynamische als auch statische Qt-Bibliotheken installiert sind. Der Linker wählt immer die dynamische Verknüpfung gegenüber der statischen. Wenn Sie ausschließlich statische Bibliotheken verwenden möchten, haben Sie folgende Möglichkeiten:

  • Ihre dynamischen Qt-Bibliotheken (.dylibs) während der Verknüpfung der Anwendung in ein anderes Verzeichnis verschieben und anschließend wieder zurückverschieben,
  • oder die Datei „ Makefile “ bearbeiten und die Verknüpfungszeilen für die Qt-Bibliotheken durch den absoluten Pfad zu den statischen Bibliotheken ersetzen.

Ersetzen Sie beispielsweise Folgendes:

-lQtGui

durch Folgendes:

/where/static/qt/lib/is/libQtGui.a

Das „Plug & Paint “-Beispiel besteht aus mehreren Komponenten: der Kernanwendung (Plug & Paint) sowie den Plugins „Basic Tools “ und „Extra Filters “. Da wir Plugins mit dem statischen Verknüpfungsansatz nicht bereitstellen können, ist das bisher vorbereitete Bundle unvollständig. Die Anwendung läuft zwar, aber die Funktionalität ist aufgrund der fehlenden Plugins deaktiviert. Um pluginbasierte Anwendungen bereitzustellen, sollten wir den für macOS spezifischen Framework-Ansatz verwenden.

Frameworks

Stellen Sie bei diesem Ansatz sicher, dass die Qt-Laufzeitumgebung korrekt mit dem Anwendungsbundle verteilt wird und dass die Plugins am richtigen Speicherort installiert sind, damit die Anwendung sie finden kann.

Es gibt zwei Möglichkeiten, Qt im Rahmen des Framework-Ansatzes mit Ihrer Anwendung zu verteilen:

  • Privates Framework innerhalb Ihres Anwendungs-Bundles.
  • Standard-Framework (alternativ können Sie die Qt-Frameworks in der installierten Binärdatei verwenden).

Die erste Option eignet sich, wenn Sie Qt auf besondere Weise kompiliert haben oder sicherstellen möchten, dass das Framework vorhanden ist. Es kommt lediglich darauf an, wo Sie die Qt-Frameworks ablegen.

Die zweite Option eignet sich, wenn Sie viele Qt-Anwendungen haben und möchten, dass diese ein einziges Qt-Framework anstelle mehrerer Versionen davon verwenden.

Qt als Frameworks kompilieren

Wir gehen davon aus, dass Sie Qt bereits als Frameworks installiert haben – dies ist die Standardeinstellung bei der Installation von Qt – und zwar im Verzeichnis /path/to/Qt. Weitere Informationen zum Erstellen von Qt ohne Frameworks finden Sie in der Dokumentation „Qt für macOS – Spezifische Probleme “.

Bei der Installation wird der Identifikationsname der Frameworks festgelegt. Dieser Name wird vom dynamischen Linker (dyld) verwendet, um die Bibliotheken für Ihre Anwendung zu finden.

Die Anwendung mit Qt als Frameworks verknüpfen

Nachdem wir Qt als Frameworks kompiliert haben, können wir die Plug & Paint -Anwendung kompilieren.

Verwendung von CMake

Um für Apple-Plattformen zu kompilieren, müssen Sie cmake_minimum_required() auf 3.21.1 oder höher setzen:

cmake_minimum_required(VERSION 3.21.1)

Wechseln Sie in das Verzeichnis, das die Anwendung enthält:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

Setzen Sie anschließend die Variable ` CMAKE_PREFIX_PATH ` so, dass sie auf Ihr Installationspräfix verweist. Falls bereits ein CMake-Build vorhanden ist, löschen Sie die Datei ` CMakeCache.txt `. Führen Sie anschließend CMake erneut aus:

cmake -DCMAKE_PREFIX_PATH=path/to/Qt/6.12.0/your_platform -S <source-dir> -B <build-dir> -G Ninja

Alternativ können Sie das Hilfsskript „ qt-cmake “ verwenden, das die Variable „ CMAKE_PREFIX_PATH “ für Sie setzt.

path/to/Qt/6.12.0/your_platform/bin/qt-cmake -S <source-dir> -B <build-dir> -G Ninja

Wechseln Sie abschließend in Ihr Build-Verzeichnis und führen Sie Ihr bevorzugtes Build-System aus. In diesem Beispiel verwenden wir „ Ninja “.

cd path/to/build/dir
ninja

Sofern alles ohne Fehler kompiliert und verknüpft wurde, sollte nun ein „ plugandpaint.app “-Bundle zur Bereitstellung bereitstehen. Versuchen Sie, das Bundle auf einem Rechner mit macOS zu installieren, auf dem weder Qt noch Qt-Anwendungen installiert sind.

Verwendung von qmake

Wechseln Sie zunächst in das Verzeichnis, das die Anwendung enthält:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

Führen Sie „ qmake “ aus, um ein neues Makefile für die Anwendung zu erstellen, und führen Sie einen „clean build“ durch, um die dynamisch verknüpfte ausführbare Datei zu erstellen:

make clean
qmake -config release
make

Dadurch wird die Kernanwendung erstellt. Verwenden Sie Folgendes, um die Plugins zu erstellen:

cd ../plugandpaint/plugins
make clean
qmake -config release
make

Führen Sie nun den Befehl „ otool “ für die Qt-Frameworks aus, zum Beispiel für Qt GUI:

otool -L QtGui.framework/QtGui

Sie erhalten die folgende Ausgabe:

QtGui.framework/QtGui:
/path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
        (compatibility version 4.0.0, current version 4.0.1)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
        (compatibility version 2.0.0, current version 128.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime
        (compatibility version 1.0.0, current version 10.0.0)
/path/to/Qt/QtCore.framework/Versions/4.0/QtCore
        (compatibility version 4.0.0, current version 4.0.1)
/usr/lib/libz.1.dylib
        (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
        (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libstdc++.6.dylib
        (compatibility version 7.0.0, current version 7.3.0)
/usr/lib/libgcc_s.1.dylib
        (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libmx.A.dylib
        (compatibility version 1.0.0, current version 92.0.0)
/usr/lib/libSystem.B.dylib
        (compatibility version 1.0.0, current version 88.0.0)

Bei den Qt-Frameworks wird die erste Zeile (d. h. „ path/to/Qt/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.0.0, current version 4.0.1) “) zum Identifikationsnamen des Frameworks, der vom dynamischen Linker („dyld “) verwendet wird.

Wenn Sie die Anwendung jedoch bereitstellen, haben Ihre Benutzer die Qt-Frameworks möglicherweise nicht am angegebenen Speicherort installiert. Aus diesem Grund müssen Sie die Frameworks entweder an einem vereinbarten Speicherort bereitstellen oder im Bundle speichern. Unabhängig davon, für welche Lösung Sie sich entscheiden, müssen Sie sicherstellen, dass die Frameworks den richtigen Identifikationsnamen für sich selbst zurückgeben und dass die Anwendung nach diesen Namen sucht. Glücklicherweise können wir dies mit dem Befehlszeilentool „ install_name_tool “ steuern.

Das Tool „ install_name_tool “ arbeitet in zwei Modi: „ -id “ und „ -change “. Der Modus „ -id “ ist für Bibliotheken und Frameworks vorgesehen und ermöglicht es uns, einen neuen Identifikationsnamen anzugeben. Den Modus „ -change “ verwenden wir, um die Pfade in der Anwendung zu ändern.

Probieren wir dies aus, indem wir die Qt-Frameworks in das „Plug & Paint“-Bundle kopieren. Wenn wir uns die Ausgabe von „ otool “ für das Bundle ansehen, stellen wir fest, dass wir sowohl die „ QtCore “- als auch die „ QtGui “-Frameworks in das Bundle kopieren müssen. Wir gehen davon aus, dass wir uns in dem Verzeichnis befinden, in dem wir das Bundle erstellt haben.

mkdir plugandpaint.app/Contents/Frameworks
cp -R /path/to/Qt/lib/QtCore.framework
        plugandpaint.app/Contents/Frameworks
cp -R /path/to/Qt/lib/QtGui.framework
       plugandpaint.app/Contents/Frameworks

Zunächst erstellen wir innerhalb des Bundles ein Verzeichnis namens „ Frameworks “. Dies entspricht der Konvention für macOS-Anwendungen. Anschließend kopieren wir die Frameworks in das neue Verzeichnis. Da Frameworks symbolische Links enthalten, verwenden wir die Option „ -R “.

install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
       plugandpaint.app/Contents/Frameworks/QtCore.framework/Versions/4.0/QtCore
install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
       plugandpaint.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui

Anschließend führen wir „ install_name_tool “ aus, um die Identifikationsnamen für die Frameworks festzulegen. Das erste Argument nach „ -id “ ist der neue Name, und das zweite Argument ist das Framework, das wir umbenennen möchten. Der Text „ @executable_path “ ist eine spezielle „ dyld “-Variable, die „ dyld “ anweist, dort zu suchen, wo sich die ausführbare Datei befindet. Die neuen Namen geben an, dass sich diese Frameworks im Verzeichnis direkt unter dem Verzeichnis „ Frameworks “ befinden.

install_name_tool -change path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/MacOs/plugandpaint
install_name_tool -change path/to/qt/lib/QtGui.framework/Versions/4.0/QtGui
        @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
        plugandpaint.app/Contents/MacOs/plugandpaint

Nun weiß der dynamische Linker, wo er nach „ QtCore “ und „ QtGui “ suchen muss. Wir müssen sicherstellen, dass auch die Anwendung weiß, wo sie die Bibliothek findet, und zwar mithilfe des Modus „ -change “ von „ install_name_tool “. Im Grunde läuft dies auf eine Zeichenfolgenersetzung hinaus, um die zuvor festgelegten Identifikationsnamen mit den Frameworks abzugleichen.

Schließlich hängt das „ QtGui “-Framework von QtCore ab, daher müssen wir daran denken, den Verweis auf QtGui zu ändern:

install_name_tool -change path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui

Danach führen wir „ otool “ erneut aus und stellen fest, dass die Anwendung die Bibliotheken finden kann.

Die Plugins für das „Plug & Paint“-Beispiel machen die Sache interessant. Die grundlegenden Schritte, die wir bei Plugins befolgen müssen, sind:

  • die Plugins in das Bundle einfügen,
  • install_name_tool ausführen, um zu überprüfen, ob die Plugins die richtige Bibliothek verwenden,
  • und sicherstellen, dass die Anwendung weiß, wo sie nach den Plugins suchen muss.

Wir können die Plugins an einer beliebigen Stelle im Bundle ablegen, am besten jedoch unter „Contents/Plugins“. Als wir die „Plug & Paint“-Plugins erstellt haben, befanden sich die „ .dylib “-Dateien der Plugins – basierend auf der Variablen „ DESTDIR “ in deren „ .pro “-Datei – im Unterverzeichnis „ plugins “ unter dem Verzeichnis „ plugandpaint “. Wir müssen dieses Verzeichnis lediglich an den richtigen Speicherort verschieben.

mv plugins plugandpaint.app/Contents

Wenn wir beispielsweise den Befehl „ otool “ auf die Datei „ .dylib “ des „Basic Tools“-Plugins anwenden, erhalten wir die folgenden Informationen.

libpnp_basictools.dylib:
libpnp_basictools.dylib
       (compatibility version 0.0.0, current version 0.0.0)
/path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
       (compatibility version 4.0.0, current version 4.0.1)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
       (compatibility version 2.0.0, current version 128.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime
       (compatibility version 1.0.0, current version 10.0.0)
/path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
       (compatibility version 4.0.0, current version 4.0.1)
/usr/lib/libz.1.dylib
       (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
       (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libstdc++.6.dylib
       (compatibility version 7.0.0, current version 7.3.0)
/usr/lib/libgcc_s.1.dylib
       (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libmx.A.dylib
       (compatibility version 1.0.0, current version 92.0.0)
/usr/lib/libSystem.B.dylib
       (compatibility version 1.0.0, current version 88.0.0)

Dann sehen wir, dass das Plugin auf die Qt-Frameworks verweist, mit denen es erstellt wurde. Da wir möchten, dass die Plugins das Framework im Anwendungsbundle verwenden, nehmen wir an ihnen dieselben Änderungen vor wie bei der Anwendung. Beispielsweise für das „Basic Tools“-Plugin:

install_name_tool -change /path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/plugins/libpnp_basictools.dylib
install_name_tool -change /path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
        @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
        plugandpaint.app/Contents/plugins/libpnp_basictools.dylib

Außerdem müssen wir den Code in ` tools/plugandpaint/mainwindow.cpp ` so ändern, dass er ` cdUp()` aufruft, um sicherzustellen, dass die Anwendung die Plugins findet. Fügen Sie den folgenden Code zur Datei ` mainwindow.cpp ` hinzu:

#elif defined(Q_OS_MACOS)
if (pluginsDir.dirName() == "MacOS") {
    pluginsDir.cdUp();
}
#endif
Der macOS-Finder zeigt das bereitgestellte App-Bundle mit den Plugin-Ordnern anDer zusätzliche Code in „ tools/plugandpaint/mainwindow.cpp “ ermöglicht es uns außerdem, die Plugins im Finder anzuzeigen, wie in der Abbildung dargestellt.

Wir können auch Plugins hinzufügen, die Qt erweitern, zum Beispiel SQL-Treiber oder Bildformate. Dazu müssen wir lediglich die in der Plugin-Dokumentation beschriebene Verzeichnisstruktur befolgen und sicherstellen, dass sie in die Datei „ QCoreApplication::libraryPaths “ () aufgenommen werden. Lassen Sie uns dies kurz anhand der Bildformate tun und dabei die zuvor beschriebene Vorgehensweise befolgen.

Kopieren Sie die Bildformat-Plugins von Qt Image Formats in das Bundle:

cp -R /path/to/Qt/plugins/imageformats
        pluginandpaint.app/Contents/plugins

Verwenden Sie „ install_name_tool “, um die Plugins mit den Frameworks im Bundle zu verknüpfen:

install_name_tool -change /path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
        @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
        plugandpaint.app/Contents/plugins/imageformats/libqjpeg.dylib
install_name_tool -change /path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/plugins/imageformats/libqjpeg.dylib

Aktualisieren Sie den Quellcode in „ tools/plugandpaint/main.cpp “, damit die neuen Plugins berücksichtigt werden. Nach dem Erstellen von „ QApplication “ fügen wir den folgenden Code hinzu:

QDir dir(QCoreApplication::applicationDirPath());
dir.cdUp();
dir.cd("plugins");
QCoreApplication::setLibraryPaths(QStringList(dir.absolutePath()));

Zunächst weisen wir die Anwendung an, nur in diesem Verzeichnis nach Plugins zu suchen. In unserem Fall möchten wir, dass die Anwendung nur nach den Plugins sucht, die wir mit dem Bundle bereitstellen. Wären wir Teil einer größeren Qt-Installation, hätten wir stattdessen QCoreApplication::addLibraryPath() verwenden können.

Warnung: Beim Einbinden von Plugins nehmen wir Änderungen am Quellcode vor, wodurch die Standard-Identifikationsnamen beim Neuerstellen der Anwendung zurückgesetzt werden. Daher müssen Sie den Vorgang wiederholen, bei dem Ihre Anwendung mithilfe von ` install_name_tool` mit den richtigen Qt-Frameworks im Bundle verknüpft wird.

Nun sollten Sie in der Lage sein, die Anwendung auf einen anderen macOS-Rechner zu verschieben und dort auszuführen, ohne dass Qt installiert ist. Alternativ können Sie Ihre Frameworks, die sich außerhalb des Bundles befinden, in ein anderes Verzeichnis verschieben und prüfen, ob die Anwendung weiterhin läuft.

Wenn Sie die Frameworks an einem anderen Ort außerhalb des Bundles speichern, ist die Vorgehensweise beim Verknüpfen Ihrer Anwendung ähnlich; Sie müssen sicherstellen, dass die Anwendung und die Frameworks übereinstimmen, wo nach den Qt-Bibliotheken sowie den Plugins gesucht werden soll.

Erstellen des Anwendungspakets

Wenn Sie die Verknüpfung Ihrer Anwendung mit Qt – entweder statisch oder als Frameworks – abgeschlossen haben, ist die Anwendung bereit für die Verteilung. Weitere Informationen finden Sie auf der Apple Developer -Website.

Auch wenn die Bereitstellung einer Anwendung einige Tücken birgt, kannst du, sobald du die verschiedenen Probleme kennst, problemlos Pakete erstellen, an denen alle deine macOS-Nutzer Freude haben werden.

Anwendungsabhängigkeiten

Qt-Plugins

Alle „ Qt GUI “-Anwendungen benötigen ein Plugin, das die Qt Platform Abstraction (QPA)-Schicht in Qt implementiert. Unter macOS lautet der Name des Plattform-Plugins „ libqcocoa.dylib “. Diese Datei muss sich in einem bestimmten Unterverzeichnis (standardmäßig „ platforms “) unterhalb Ihres Distributionsverzeichnisses befinden. Alternativ ist es möglich, den Suchpfad anzupassen, den Qt zum Auffinden seiner Plugins verwendet, wie im Folgenden beschrieben.

Ihre Anwendung hängt möglicherweise auch von einem oder mehreren Qt-Plugins ab, wie beispielsweise dem Plugin für das JPEG-Bildformat oder einem SQL-Treiber-Plugin. Achten Sie darauf, alle benötigten Qt-Plugins zusammen mit Ihrer Anwendung zu verteilen. Ähnlich wie beim Plattform-Plugin muss sich jeder Plugin-Typ in einem bestimmten Unterverzeichnis (z. B. imageformats oder sqldrivers) in Ihrem Verteilungsverzeichnis befinden.

Der Suchpfad für Qt-Plugins (sowie einige andere Pfade) ist fest in der Bibliothek „ QtCore “ hinterlegt. Standardmäßig ist der erste Suchpfad für Plugins fest auf „ /path/to/Qt/plugins “ festgelegt. Die Verwendung festgelegter Pfade hat jedoch gewisse Nachteile. Beispielsweise sind sie auf dem Zielrechner möglicherweise nicht vorhanden. Daher müssen Sie verschiedene Alternativen prüfen, um sicherzustellen, dass die Qt-Plugins gefunden werden:

Das Dokument „How to Create Qt Plugins“ beschreibt die Punkte, die Sie beim Erstellen und Bereitstellen von Plugins für Qt-Anwendungen beachten müssen.

Zusätzliche Bibliotheken

Mit dem Befehl „ otool “ können Sie überprüfen, mit welchen Bibliotheken Ihre Anwendung verknüpft ist. Führen Sie diesen Befehl mit dem Pfad zur Anwendung als Argument aus:

otool -L MyApp.app/Contents/MacOS/MyApp

Compilerspezifische Bibliotheken müssen nur selten zusammen mit Ihrer Anwendung weiterverteilt werden. Es gibt jedoch verschiedene Möglichkeiten, Anwendungen bereitzustellen, da Qt unter macOS auf verschiedene Arten konfiguriert, kompiliert und installiert werden kann. In der Regel bestimmen Ihre Ziele, wie Sie die Anwendung bereitstellen werden. In den letzten Abschnitten werden einige Punkte beschrieben, die Sie bei der Bereitstellung Ihrer Anwendung beachten müssen.

Das macOS-Bereitstellungstool

Das macOS-Bereitstellungstool finden Sie unter QTDIR/bin/macdeployqt. Es dient dazu, den Prozess der Erstellung eines bereitstellbaren Anwendungsbundles zu automatisieren, das Qt-Bibliotheken als private Frameworks enthält.

Das macOS-Bereitstellungstool stellt außerdem die Qt-Plugins gemäß den folgenden Regeln bereit (sofern nicht die Option „ -no-plugins “ verwendet wird):

  • Das Plattform-Plugin wird immer bereitgestellt.
  • Debug-Versionen der Plugins werden nicht bereitgestellt.
  • Die Designer-Plugins werden nicht bereitgestellt.
  • Die Bildformat-Plugins werden immer installiert, mit Ausnahme des SVG-Bildformat-Plugins, das nur installiert wird, wenn die Anwendung das Qt SVG Modul verwendet.
  • Die Icon-Engine-Plugins werden immer bereitgestellt.
  • Das Plugin für die Druckunterstützung wird immer bereitgestellt.
  • SQL-Treiber-Plugins werden bereitgestellt, wenn die Anwendung das Qt SQL Modul verwendet.
  • Das Barrierefreiheits-Plugin wird immer bereitgestellt.
  • Das Stil-Plugin wird immer bereitgestellt.

Wichtig: Wenn Sie das Mac-Bereitstellungstool nicht verwenden möchten, müssen Sie sicherstellen, dass Ihr Bereitstellungspaket diese Plugins enthält.

Um eine Bibliothek eines Drittanbieters in das Anwendungsbundle aufzunehmen, kopieren Sie die Bibliothek nach der Erstellung des Bundles manuell in das Bundle.

macdeployqt unterstützt die folgenden Optionen:

OptionBeschreibung
-verbose=<0-3>0 = keine Ausgabe, 1 = Fehler/Warnung (Standard), 2 = normal, 3 = Debug
-no-pluginsPlugin-Bereitstellung überspringen
-dmgErstelle ein .dmg-Disk-Image
-no-strip„strip“ nicht auf die Binärdateien anwenden
-use-debug-libsBereitstellung mit Debug-Versionen von Frameworks und Plugins (impliziert „ -no-strip “)
-executable=<path>Die angegebene ausführbare Datei soll ebenfalls die bereitgestellten Frameworks verwenden
-qmldir=<path>Die von .qml-Dateien verwendeten Importe im angegebenen Pfad bereitstellen
-qmlimport=<path>Fügen Sie den angegebenen Pfad zu den Suchorten für QML-Importe hinzu
-always-overwriteKopiere Dateien auch dann, wenn die Zieldatei bereits vorhanden ist
-codesign=<ident>Führen Sie „ codesign “ mit der angegebenen Identität für alle ausführbaren Dateien aus. Standardmäßig wird die Ad-hoc-Signierung (-codesign=-) verwendet.
-no-codesignCode-Signierung deaktivieren
-hardened-runtime„Hardened Runtime“ bei der Codesignierung aktivieren
-timestampBei der Codesignierung einen sicheren Zeitstempel einfügen (erfordert Internetverbindung)
-sign-for-notarization=<ident>Aktivieren Sie die erforderlichen Optionen für die Beglaubigung (erfordert eine Internetverbindung). Die aktivierten Optionen sind „ -hardened-runtime “, „ -timestamp “ und -codesign=<ident>
-appstore-compliant„Bereitstellung von Komponenten überspringen, die private APIs verwenden“
-libpath=<path>Fügen Sie den angegebenen Pfad zum Bibliothekssuchpfad hinzu
-fs=<filesystem>Legen Sie das für das .dmg-Disk-Image verwendete Dateisystem fest (Standard ist HFS+)

Hinweis: MitmacOS High Sierra wurde das neue Apple File System (APFS) eingeführt. Ältere Versionen von macOS können keine mit APFS formatierten .dmg-Dateien lesen. Standardmäßig verwendet „ macdeployqt “ das ältere HFS+-Dateisystem, um die Kompatibilität mit allen derzeit von Qt unterstützten Versionen von macOS zu gewährleisten. Verwenden Sie die Option „ -fs “, um ein anderes Dateisystem festzulegen.

Volumen-Name

Der Datenträgername eines mit „ -dmg “ erstellten Festplatten-Images (der Text, der im Fenstertitel einer geöffneten „ .dmg “-Datei angezeigt wird) basiert auf dem Pfad zur Anwendung zum Zeitpunkt der Ausführung von „ macdeployqt “. Betrachten Sie beispielsweise den folgenden Befehl, der ein Festplatten-Image für eine Anwendung unter „ Qt Quick “ erstellt:

macdeployqt /Users/foo/myapp-build/MyApp.app -qmldir=/Users/foo/myapp/qml -dmg

Der resultierende Volumenname lautet dann:

/Users/foo/myapp-build/MyApp.app

Um sicherzustellen, dass der Volumenname nur den Anwendungsnamen und nicht den Pfad auf dem Bereitstellungsrechner enthält, führen Sie im selben Verzeichnis den Befehl „ macdeployqt “ aus:

cd /Users/foo/myapp-build
macdeployqt MyApp.app -qmldir=/Users/foo/myapp/qml -dmg

Der resultierende Volumenname lautet dann:

MyApp.app

Berechtigungen

Beim Signieren verwendet „ macdeployqt “ automatisch die erste .entitlements-Datei, die es im Unterverzeichnis „Contents/Resources/“ des Anwendungsbundles findet, sofern vorhanden. Um Fehler zu vermeiden, stellen Sie sicher, dass sich in diesem Ordner höchstens eine .entitlements-Datei befindet.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.