Qt für macOS - Bereitstellung
Dieses Dokument beschreibt, wie man ein macOS-Bundle erstellt und sicherstellt, dass die Anwendung die benötigten Ressourcen zur Laufzeit findet. Wir demonstrieren die Verfahren anhand der Bereitstellung der Plug & Paint-Beispielanwendung, die mit dem Qt-Quellpaket geliefert wird.
Die Qt-Installationsprogramme für macOS enthalten ein Bereitstellungswerkzeug, das die hier beschriebenen Verfahren automatisiert.
Das Bündel
Unter macOS muss eine GUI-Anwendung aus einem Bundle erstellt und ausgeführt werden. Dabei handelt es sich um eine Verzeichnisstruktur, die im Finder als eine einzige Einheit erscheint. Ein Bundle für eine Anwendung enthält normalerweise die ausführbare Datei und alle benötigten Ressourcen. Hier sehen Sie einen Schnappschuss der Struktur eines Anwendungspakets:
Das Bundle bietet dem Benutzer viele Vorteile:
- Es ist einfach zu installieren, da es als eine einzige Einheit identifiziert wird.
- Informationen über ein Bundle sind über den Code zugänglich.
Dies ist spezifisch für macOS und würde den Rahmen dieses Dokuments sprengen. Weitere Informationen zu Bundles finden Sie auf der Developer Website von Apple.
Um Ihre Anwendung als Bundle mit CMake zu erstellen, setzen Sie die MACOSX_BUNDLE
Eigenschaft auf Ihr ausführbares Ziel:
set_target_properties(plugandpaint PROPERTIES MACOSX_BUNDLE TRUE )
qmake
erzeugt automatisch ein Bundle für Ihre Anwendung. Um dies zu deaktivieren, fügen Sie die folgende Anweisung in die Projektdatei Ihrer Anwendung ein (.pro
):
CONFIG-=app_bundle
Statisches Linken
Wenn Sie die Dinge einfach halten wollen und nur ein paar Dateien bereitstellen müssen, können Sie Ihre Anwendung mit statisch gelinkten Bibliotheken erstellen.
Qt statisch erstellen
Installieren Sie zunächst eine statische Version der Qt-Bibliothek. Denken Sie daran, dass Sie keine Plugins verwenden können und dass Sie die abhängigen Bibliotheken wie Bildformate, SQL-Treiber und so weiter mit statischer Verknüpfung erstellen müssen.
cd /path/to/Qt ./configure -static <other parameters>
Sie können die verschiedenen verfügbaren Optionen überprüfen, indem Sie configure
-help aufrufen.
Verknüpfen der Anwendung mit der statischen Version von Qt
Sobald Qt statisch gebaut ist, besteht der nächste Schritt darin, die Build-Dateien neu zu generieren und die Anwendung neu zu erstellen.
CMake verwenden
Stellen Sie sicher, dass Sie den Wrapper-Befehl qt_add_executable
verwenden, der zusätzliche Logik wie das Verknüpfen von Qt-Plugins in statischen Qt-Builds bietet.
Um für Apple-Plattformen zu bauen, müssen Sie cmake_minimum_required()
auf 3.21.1 oder neuer einstellen:
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
Als nächstes setzen Sie die Variable CMAKE_PREFIX_PATH
auf Ihr Installationspräfix. Wenn Sie bereits ein Cmake-Build haben, löschen Sie die Datei CMakeCache.txt
. Führen Sie dann CMake erneut aus:
cmake -DCMAKE_PREFIX_PATH=path/to/Qt/6.8.2/your_platform -S <source-dir> -B <build-dir> -G Ninja
Alternativ können Sie auch das Skript qt-cmake
verwenden, das die Variable CMAKE_PREFIX_PATH
für Sie setzt.
path/to/Qt/6.8.2/your_platform/bin/qt-cmake -S <source-dir> -B <build-dir> -G Ninja
Gehen Sie schließlich 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
Wenn alles fehlerfrei kompiliert und gelinkt wurde, sollten Sie nun ein plugandpaint.app
Bundle haben, das bereit für den Einsatz ist. Versuchen Sie, das Bundle auf einem Rechner mit macOS zu installieren, auf dem weder Qt noch andere Qt-Anwendungen installiert sind.
qmake verwenden
Wechseln Sie zunächst in das Verzeichnis, das die Anwendung enthält:
cd /path/to/Qt/examples/widgets/tools/plugandpaint/app
Führen Sie dann qmake
aus, um ein neues Makefile für die Anwendung zu erstellen, und führen Sie einen sauberen Build durch, um die statisch gelinkte ausführbare Datei zu erstellen:
make clean
qmake -config release
make
Wahrscheinlich wollen Sie gegen die Release-Bibliotheken linken, und Sie können dies beim Aufruf von qmake
angeben. Vielleicht möchten Sie die Vorteile des "dead code stripping" nutzen, um die Größe Ihrer Binärdatei noch weiter zu reduzieren. Sie können dies tun, indem Sie LIBS+= -dead_strip
an qmake
zusätzlich zu dem Parameter -config release
übergeben.
Vorausgesetzt, dass alles fehlerfrei kompiliert und gelinkt wurde, sollten Sie ein plugandpaint.app
-Bundle haben, das bereit für die Bereitstellung ist. Versuchen Sie, das Bundle auf einem Rechner mit macOS zu installieren, auf dem weder Qt noch andere Qt-Anwendungen installiert sind.
Überprüfen der verlinkten Bibliotheken
Sie können überprüfen, mit welchen anderen Bibliotheken Ihre Anwendung verlinkt ist, indem Sie otool
verwenden:
otool -L plugandpaint.app/Contents/MacOs/plugandpaint
So sieht die Ausgabe für das statisch gelinkte 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 Sie Qt-Bibliotheken in der Ausgabe sehen, bedeutet das wahrscheinlich, dass Sie sowohl dynamische als auch statische Qt-Bibliotheken auf Ihrem Rechner installiert haben. Der Linker wählt immer das dynamische Linken gegenüber dem statischen. Wenn Sie nur statische Bibliotheken verwenden möchten, können Sie entweder:
- Ihre dynamischen Qt-Bibliotheken (
.dylibs
) in ein anderes Verzeichnis verschieben, während Sie die Anwendung linken, und sie dann zurückschieben, - oder die
Makefile
bearbeiten und die Link-Zeilen für die Qt-Bibliotheken durch den absoluten Pfad zu den statischen Bibliotheken ersetzen.
Ersetzen Sie zum Beispiel die folgenden Zeilen:
-lQtGui
mit diesem:
/where/static/qt/lib/is/libQtGui.a
Das Plug & Paint Beispiel besteht aus mehreren Komponenten: Die Kernanwendung(Plug & Paint), und die Plugins Basic Tools und Extra Filters. Da wir Plugins nicht mit dem Ansatz der statischen Verknüpfung bereitstellen können, ist das bisher vorbereitete Bundle unvollständig. Die Anwendung wird zwar laufen, aber die Funktionalität wird aufgrund der fehlenden Plugins deaktiviert sein. Um Plugin-basierte Anwendungen bereitzustellen, sollten wir den Framework-Ansatz verwenden, der spezifisch für macOS ist.
Frameworks
Bei diesem Ansatz muss sichergestellt werden, dass die Qt-Laufzeitumgebung korrekt mit dem Anwendungsbündel verteilt wird und dass die Plugins am richtigen Ort installiert werden, damit die Anwendung sie findet.
Beim Frameworks-Ansatz gibt es zwei Möglichkeiten, Qt mit Ihrer Anwendung zu verteilen:
- Privates Framework innerhalb Ihres Anwendungspakets.
- Standard-Framework (alternativ können Sie die Qt-Frameworks in der installierten Binärdatei verwenden).
Die erste Option ist gut, wenn Sie Qt auf eine spezielle Art und Weise gebaut haben, oder sicherstellen wollen, dass das Framework vorhanden ist. Es kommt nur darauf an, wo Sie die Qt-Frameworks platzieren.
Die zweite Option ist gut, wenn Sie viele Qt-Anwendungen haben und Sie möchten, dass diese ein einziges Qt-Framework verwenden und nicht mehrere Versionen davon.
Qt als Frameworks bauen
Wir gehen davon aus, dass Sie Qt bereits als Frameworks installiert haben, was der Standard bei der Installation von Qt ist, und zwar im Verzeichnis /path/to/Qt. Weitere Informationen darüber, wie Sie Qt ohne Frameworks bauen können, finden Sie in der Dokumentation Qt für macOS - Spezielle Probleme.
Bei der Installation wird der Identifikationsname des Frameworks festgelegt. Dieser Name wird vom dynamischen Linker (dyld
) verwendet, um die Bibliotheken für Ihre Anwendung zu finden.
Verknüpfen der Anwendung mit Qt als Frameworks
Nachdem wir Qt als Frameworks erstellt haben, können wir die Plug & Paint-Anwendung erstellen.
CMake verwenden
Um für Apple-Plattformen zu bauen, müssen Sie cmake_minimum_required()
auf 3.21.1 oder neuer einstellen:
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
Als nächstes setzen Sie die Variable CMAKE_PREFIX_PATH
auf Ihr Installationspräfix. Wenn Sie bereits ein Cmake-Build haben, löschen Sie die Datei CMakeCache.txt
. Führen Sie dann CMake erneut aus:
cmake -DCMAKE_PREFIX_PATH=path/to/Qt/6.8.2/your_platform -S <source-dir> -B <build-dir> -G Ninja
Alternativ können Sie auch das Skript qt-cmake
verwenden, das die Variable CMAKE_PREFIX_PATH
für Sie setzt.
path/to/Qt/6.8.2/your_platform/bin/qt-cmake -S <source-dir> -B <build-dir> -G Ninja
Gehen Sie schließlich 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
Wenn alles fehlerfrei kompiliert und gelinkt wurde, sollten Sie nun ein plugandpaint.app
Bundle haben, das bereit für den Einsatz ist. Versuchen Sie, das Bundle auf einem Rechner mit macOS zu installieren, auf dem weder Qt noch andere Qt-Anwendungen installiert sind.
qmake verwenden
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 sauberen Build durch, um die dynamisch gelinkte ausführbare Datei zu erstellen:
make clean
qmake -config release
make
Dadurch wird die Kernanwendung erstellt. Verwenden Sie das Folgende, um die Plugins zu bauen:
cd ../plugandpaint/plugins make clean qmake -config release make
Führen Sie nun die otool
für die Qt-Frameworks aus, zum Beispiel Qt Gui:
Sie würden die folgende Ausgabe erhalten:
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)
Für die 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 verwendet wird (dyld
).
Wenn Sie die Anwendung bereitstellen, kann es jedoch sein, dass Ihre Benutzer die Qt-Frameworks nicht an dem angegebenen Ort installiert haben. Aus diesem Grund müssen Sie entweder die Frameworks an einem vereinbarten Ort bereitstellen oder die Frameworks im Bundle speichern. Unabhängig davon, welche Lösung Sie wählen, 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 Befehlszeilenwerkzeug install_name_tool
kontrollieren.
install_name_tool
arbeitet in zwei Modi, -id
und -change
. Der Modus -id
ist für Bibliotheken und Frameworks gedacht und ermöglicht es uns, einen neuen Identifikationsnamen anzugeben. Wir verwenden den Modus -change
, um die Pfade in der Anwendung zu ändern.
Testen wir dies, indem wir die Qt-Frameworks in das Plug & Paint-Bundle kopieren. Wenn wir uns die Ausgabe von otool
für das Bundle ansehen, können wir erkennen, dass wir sowohl das QtCore als auch das QtGui Framework 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
Zuerst erstellen wir ein Frameworks
Verzeichnis innerhalb des Bundles. Dies entspricht der macOS-Anwendungskonvention. Dann 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
Dann führen wir install_name_tool
aus, um die Identifikationsnamen für die Frameworks zu setzen. Das erste Argument nach -id
ist der neue Name, und das zweite Argument ist das Framework, das umbenannt werden soll. Der Text @executable_path
ist eine spezielle dyld
-Variable, die dyld
mitteilt, wo die ausführbare Datei zu suchen ist. Die neuen Namen geben an, dass sich diese Frameworks in dem 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
Jetzt weiß der dynamische Linker, wo er nach QtCore und QtGui suchen muss. Wir müssen sicherstellen, dass die Anwendung auch weiß, wo sie die Bibliothek finden kann, indem sie den Modus install_name_tool
's -change
verwendet. Dies läuft im Wesentlichen auf die Ersetzung von Zeichenketten hinaus, um die Identifikationsnamen, die wir zuvor festgelegt haben, mit den Frameworks abzugleichen.
Schließlich hängt das Framework QtGui von QtCore ab, so dass wir daran denken müssen, die Referenz für 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 sehen, dass die Anwendung die Bibliotheken finden kann.
Die Plugins für das Plug & Paint-Beispiel machen es interessant. Die grundlegenden Schritte, die wir mit Plugins befolgen müssen, sind:
- Legen Sie die Plugins in das Bundle,
- die
install_name_tool
ausführen, um zu prü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 beliebiger Stelle im Bundle ablegen, aber am besten ist es, sie unter Contents/Plugins zu platzieren. Als wir die Plug & Paint-Plugins erstellt haben, befanden sich die Dateien .dylib
der Plugins aufgrund der Variable DESTDIR
in der Datei .pro
im Unterverzeichnis plugins
unter dem Verzeichnis plugandpaint
. Wir müssen dieses Verzeichnis nur an den richtigen Ort verschieben.
mv plugins plugandpaint.app/Contents
Wenn wir zum Beispiel otool
auf die Datei .dylib
des Plugins Basic Tools anwenden, erhalten wir folgende 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 können wir sehen, dass das Plugin auf die Qt-Frameworks verweist, gegen die es gebaut wurde. Da wir möchten, dass die Plugins das Framework im Anwendungspaket verwenden, ändern wir sie auf die gleiche Weise wie die Anwendung. Zum Beispiel 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
Wir müssen auch den Code in tools/plugandpaint/mainwindow.cpp
in cdUp() ändern, um sicherzustellen, dass die Anwendung die Plugins findet. Fügen Sie den folgenden Code in die Datei mainwindow.cpp
ein:
#elif defined(Q_OS_MAC) if (pluginsDir.dirName() == "MacOS") { pluginsDir.cdUp(); } #endif
![]() | Der zusätzliche Code in tools/plugandpaint/mainwindow.cpp ermöglicht es uns auch, die Plugins im Finder anzuzeigen, wie im Bild gezeigt.Wir können auch Plugins hinzufügen, die Qt erweitern, zum Beispiel SQL-Treiber oder Bildformate. Wir müssen nur die in der Plugin-Dokumentation beschriebene Verzeichnisstruktur befolgen und sicherstellen, dass sie in QCoreApplication::libraryPaths() enthalten sind. Lassen Sie uns dies schnell mit den Bildformaten tun, indem wir das oben beschriebene Verfahren befolgen. Kopieren Sie die Bildformat-Plugins von Qt in das Bundle: cp -R /path/to/Qt/plugins/imageformats pluginandpaint.app/Contents/plugins Verwenden Sie 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 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 soll die Anwendung nur nach den Plugins suchen, die wir mit dem Bundle verteilen. Wenn wir Teil einer größeren Qt-Installation wären, hätten wir stattdessen QCoreApplication::addLibraryPath() verwenden können. |
Warnung: Während der Bereitstellung von Plugins nehmen wir Änderungen am Quellcode vor, und das setzt die Standard-Identifikationsnamen zurück, wenn die Anwendung neu erstellt wird. Sie müssen also den Prozess wiederholen, um Ihre Anwendung mit den richtigen Qt-Frameworks im Bundle zu verknüpfen, indem Sie install_name_tool
verwenden.
Jetzt sollten Sie in der Lage sein, die Anwendung auf einen anderen macOS-Rechner zu verschieben und sie ohne installiertes Qt auszuführen. Alternativ können Sie Ihre Frameworks, die sich außerhalb des Bundles befinden, in ein anderes Verzeichnis verschieben und sehen, ob die Anwendung noch läuft.
Wenn Sie die Frameworks an einem anderen Ort außerhalb des Bundles speichern, ist die Technik des Linkens Ihrer Anwendung ähnlich; Sie müssen sicherstellen, dass die Anwendung und die Frameworks übereinstimmen, wo sie nach den Qt-Bibliotheken sowie den Plugins suchen sollen.
Erstellen des Anwendungspakets
Wenn Sie Ihre Anwendung mit Qt verknüpft haben, entweder statisch oder als Frameworks, ist die Anwendung bereit, verteilt zu werden. Weitere Informationen finden Sie auf der Apple Developer Website.
Obwohl der Prozess der Bereitstellung einer Anwendung einige Fallstricke hat, können Sie, sobald Sie die verschiedenen Aspekte kennen, problemlos Pakete erstellen, die allen Ihren macOS-Benutzern gefallen werden.
Abhängigkeiten von Anwendungen
Qt-Plugins
Alle Qt GUI Anwendungen benötigen ein Plugin, das die Qt Platform Abstraction (QPA) Schicht in Qt implementiert. Für macOS lautet der Name des Plattform-Plugins libqcocoa.dylib
. Diese Datei muss sich in einem bestimmten Unterverzeichnis (standardmäßig platforms
) unter Ihrem Distributionsverzeichnis befinden. Alternativ ist es möglich, den Suchpfad anzupassen, den Qt verwendet, um seine Plugins zu finden, wie unten beschrieben.
Ihre Anwendung kann auch von einem oder mehreren Qt-Plugins abhängen, wie z.B. dem JPEG-Bildformat-Plugin oder einem SQL-Treiber-Plugin. Vergewissern Sie sich, dass Sie alle Qt-Plugins, die Sie benötigen, mit Ihrer Anwendung verteilen. Ähnlich wie beim Plattform-Plugin muss sich jedes Plugin in einem bestimmten Unterverzeichnis (z. B. imageformats
oder sqldrivers
) in Ihrem Distributionsverzeichnis befinden.
Der Suchpfad für Qt-Plugins (sowie einige andere Pfade) ist in der Bibliothek QtCore fest einprogrammiert. Standardmäßig ist der erste Plugin-Suchpfad als /path/to/Qt/plugins
fest programmiert. Die Verwendung vorgegebener Pfade hat jedoch einige Nachteile. Zum Beispiel kann es sein, dass sie auf dem Zielrechner nicht existieren. Daher müssen Sie verschiedene Alternativen prüfen, um sicherzustellen, dass die Qt-Plugins gefunden werden:
- Verwendung von
qt.conf
. Dies ist der empfohlene Ansatz, da er die größte Flexibilität bietet. - Verwendung von QApplication::addLibraryPath() oder QApplication::setLibraryPaths().
- Verwendung eines Installationsprogramms eines Drittanbieters, um die fest kodierten Pfade in der Bibliothek QtCore zu ändern.
Das Dokument How to Create Qt Plugins (Wie man Qt-Plugins erstellt ) umreißt die Punkte, auf die Sie bei der Erstellung und Bereitstellung von Plugins für Qt-Anwendungen achten müssen.
Zusätzliche Bibliotheken
Sie können überprüfen, gegen welche Bibliotheken Ihre Anwendung gelinkt ist, indem Sie otool
verwenden. Führen Sie dies mit dem Anwendungspfad als Argument aus:
otool -L MyApp.app/Contents/MacOS/MyApp
Compiler-spezifische Bibliotheken müssen nur selten zusammen mit Ihrer Anwendung weitergegeben werden. Es gibt jedoch mehrere Möglichkeiten, Anwendungen bereitzustellen, da Qt unter macOS auf verschiedene Arten konfiguriert, gebaut und installiert werden kann. In der Regel bestimmen Ihre Ziele, wie Sie die Anwendung bereitstellen wollen. Die letzten Abschnitte beschreiben ein paar Dinge, die Sie bei der Bereitstellung Ihrer Anwendung beachten müssen.
Das Mac-Bereitstellungswerkzeug
Das Mac Deployment Tool befindet sich in QTDIR/bin/macdeployqt und wurde entwickelt, um den Prozess der Erstellung eines einsatzfähigen Anwendungspakets zu automatisieren, das die Qt-Bibliotheken als private Frameworks enthält.
Das Mac Deployment Tool stellt auch die Qt-Plugins gemäß den folgenden Regeln bereit (sofern nicht die Option -no-plugins
verwendet wird):
- Das Plattform-Plugin wird immer bereitgestellt.
- Die Debug-Versionen der Plugins werden nicht bereitgestellt.
- Die Designer-Plugins werden nicht bereitgestellt.
- Die Bildformat-Plugins werden immer bereitgestellt, mit Ausnahme des SVG-Bildformat-Plugins, das nur bereitgestellt wird, wenn die Anwendung das Qt SVG Modul verwendet.
- Die Icon-Engine-Plugins werden immer eingesetzt.
- Das Plugin für die Druckunterstützung wird immer eingesetzt.
- Die SQL-Treiber-Plugins werden bereitgestellt, wenn die Anwendung das Qt SQL Modul verwendet.
- Das Zugänglichkeits-Plugin wird immer eingesetzt.
- Das Style-Plugin wird immer eingesetzt.
Wichtig: Wenn Sie das Mac Deployment Tool nicht verwenden möchten, müssen Sie sicherstellen, dass Ihr Bereitstellungspaket diese Plugins enthält.
Um eine Bibliothek eines Drittanbieters in das Anwendungsbündel aufzunehmen, kopieren Sie die Bibliothek manuell in das Bündel, nachdem das Bündel erstellt wurde.
macdeployqt
unterstützt die folgenden Optionen:
Option | Beschreibung |
---|---|
-verbose=<0-3> | 0 = keine Ausgabe, 1 = Fehler/Warnung (Standard), 2 = normal, 3 = Debug |
-no-plugins | Plugin-Bereitstellung überspringen |
-dmg | Ein .dmg Diskettenimage erstellen |
-no-strip | Kein 'strip' für die Binärdateien ausführen |
-use-debug-libs | Mit Debug-Versionen von Frameworks und Plugins bereitstellen (impliziert -no-strip ) |
-executable=<path> | Die angegebene ausführbare Datei soll auch die bereitgestellten Frameworks verwenden |
-qmldir=<path> | Importe, die von .qml-Dateien im angegebenen Pfad verwendet werden, bereitstellen |
-qmlimport=<path> | Hinzufügen des angegebenen Pfades zu den Suchorten für QML-Importe |
-always-overwrite | Kopieren von Dateien, auch wenn die Zieldatei existiert |
-codesign=<ident> | codesign mit der angegebenen Identität auf allen ausführbaren Dateien ausführen |
-hardened-runtime | Aktivieren der gehärteten Laufzeit beim Signieren von Code |
-timestamp | Einschließen eines sicheren Zeitstempels beim Signieren des Codes (Internetverbindung erforderlich) |
-sign-for-notarization=<ident> | Aktivieren Sie die notwendigen Optionen für die Beglaubigung (erfordert eine Internetverbindung). Die aktivierten Optionen sind -hardened-runtime , -timestamp und -codesign=<ident> |
-appstore-compliant | Überspringen der Bereitstellung von Komponenten, die eine private API verwenden |
-libpath=<path> | Fügen Sie den angegebenen Pfad zum Suchpfad der Bibliothek hinzu |
-fs=<filesystem> | Legen Sie das für das .dmg-Datenträgerabbild verwendete Dateisystem fest (standardmäßig HFS+) |
Hinweis: Mit macOS High Sierra wurde das neue Apple File System (APFS) eingeführt. Ältere Versionen von macOS können keine .dmg-Dateien lesen, die mit APFS formatiert sind. Standardmäßig verwendet macdeployqt
das ältere Dateisystem HFS+, um mit allen derzeit von Qt unterstützten Versionen von macOS kompatibel zu sein. Verwenden Sie die Option -fs
, um ein anderes Dateisystem anzugeben.
Volume Name
Der Volume-Name eines Disk-Images (der Text, der im Fenstertitel einer geöffneten .dmg
Datei angezeigt wird), das mit -dmg
erstellt wurde, basiert auf dem Pfad zur Anwendung, wenn macdeployqt
ausgeführt wird. Betrachten Sie zum Beispiel den folgenden Befehl, der ein Disk-Image für eine Qt Quick -Anwendung erstellt:
macdeployqt /Users/foo/myapp-build/MyApp.app -qmldir=/Users/foo/myapp/qml -dmg
Der resultierende Datenträgername lautet:
/Users/foo/myapp-build/MyApp.app
Um sicherzustellen, dass der Volume-Name nur den Anwendungsnamen und nicht den Pfad auf dem Bereitstellungsrechner enthält, führen Sie macdeployqt
im selben Verzeichnis aus:
cd /Users/foo/myapp-build macdeployqt MyApp.app -qmldir=/Users/foo/myapp/qml -dmg
Der resultierende Volume-Name lautet dann:
MyApp.app
© 2025 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.