Auf dieser Seite

Qt für Linux – Bereitstellung

Diese Dokumentation behandelt spezifische Probleme bei der Bereitstellung von Qt für Linux. Wir veranschaulichen die Vorgehensweise anhand der Bereitstellung der Beispielanwendung „Plug & Paint“, die im Qt-Quellpaket enthalten ist.

Aufgrund der Vielzahl von Unix-Systemen (wie kommerzielle Unix-Systeme oder Linux-Distributionen) ist die Bereitstellung unter Unix ein komplexes Thema. Bevor wir beginnen, sollten Sie sich bewusst sein, dass Programme, die für eine bestimmte Unix-Variante kompiliert wurden, auf einem anderen Unix-System wahrscheinlich nicht laufen werden. So können Sie beispielsweise Ihre Anwendung nicht unter Irix kompilieren und unter AIX vertreiben, es sei denn, Sie verwenden einen Cross-Compiler.

Gemeinsam genutzte Bibliotheken

Bei der Bereitstellung der „ plugandpaint “-Anwendung unter Verwendung des Ansatzes mit gemeinsam genutzten Bibliotheken stehen wir vor zwei Herausforderungen: Die Qt-Laufzeitumgebung muss zusammen mit der ausführbaren Anwendungsdatei korrekt weiterverteilt werden, und die Plugins müssen am Zielsystem am richtigen Speicherort installiert werden, damit die Anwendung sie finden kann.

Qt als gemeinsam genutzte Bibliothek erstellen

Wir gehen davon aus, dass Sie Qt bereits als gemeinsam genutzte Bibliothek im Verzeichnis „ /path/to/Qt “ installiert haben – dies ist die Standardeinstellung bei der Installation von Qt.

Die Anwendung mit Qt als gemeinsam genutzte Bibliothek verknüpfen

Nachdem sichergestellt ist, dass Qt als gemeinsam genutzte Bibliothek erstellt wurde, können wir die Anwendung „ plugandpaint “ erstellen. Zunächst müssen wir in das Verzeichnis wechseln, das die Anwendung enthält:

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

Führen Sie nun qmake aus, um eine neue 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; mit dem folgenden Befehl werden die Plugins erstellt:

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

Wenn alles ohne Fehler kompiliert und verknüpft wurde, erhalten wir eine ausführbare „ plugandpaint “-Datei sowie die Plugin-Dateien „ libpnp_basictools.so “ und „ libpnp_extrafilters.so “.

Erstellen des Anwendungspakets

Unter Unix gibt es kein einheitliches Paketverwaltungssystem, daher stellt die im Folgenden vorgestellte Methode eine generische Lösung dar. Informationen zum Erstellen eines Pakets finden Sie in der Dokumentation Ihres Zielsystems.

Um die Anwendung bereitzustellen, müssen wir sicherstellen, dass wir die relevanten Qt-Bibliotheken (entsprechend den in der Anwendung verwendeten Qt-Modulen), das Plattform-Plugin und die ausführbare Datei in denselben Verzeichnisbaum kopieren. Beachten Sie: Wenn Ihre Anwendung von kompilatorspezifischen Bibliotheken abhängt, müssen diese ebenfalls zusammen mit Ihrer Anwendung bereitgestellt werden. Weitere Informationen finden Sie im Abschnitt „Anwendungsabhängigkeiten “.

Auf die Plugins gehen wir gleich noch ein, doch das Hauptproblem bei gemeinsam genutzten Bibliotheken besteht darin, dass Sie sicherstellen müssen, dass der dynamische Linker die Qt-Bibliotheken findet. Sofern nicht anders angegeben, durchsucht der dynamische Linker nicht das Verzeichnis, in dem sich Ihre Anwendung befindet. Es gibt viele Möglichkeiten, dies zu lösen:

  • Sie können die Qt-Bibliotheken in einem der Systembibliothekspfade installieren (auf den meisten Systemen beispielsweise unter „ /usr/lib “).
  • Sie können beim Verknüpfen der Anwendung der Befehlszeilenoption „ -rpath “ einen vorgegebenen Pfad übergeben. Dadurch wird der dynamische Linker angewiesen, beim Starten Ihrer Anwendung in diesem Verzeichnis zu suchen.
  • Sie können ein Startskript für Ihre Anwendung erstellen, in dem Sie die Konfiguration des dynamischen Linkers anpassen (beispielsweise indem Sie das Verzeichnis Ihrer Anwendung zur Umgebungsvariable ` LD_LIBRARY_PATH ` hinzufügen).

    Hinweis: Wenn Ihre Anwendung mit der Option „Benutzer-ID bei Ausführung festlegen“ ausgeführt wird und wenn sie dem Benutzer „root“ gehört, wird „LD_LIBRARY_PATH“ auf einigen Plattformen ignoriert. In diesem Fall ist die Verwendung von „LD_LIBRARY_PATH“ keine Option.

Der Nachteil des ersten Ansatzes besteht darin, dass der Benutzer Superuser-Rechte haben muss. Der Nachteil des zweiten Ansatzes besteht darin, dass der Benutzer möglicherweise nicht über die erforderlichen Rechte verfügt, um in den vorgegebenen Pfad zu installieren. In beiden Fällen haben die Benutzer nicht die Möglichkeit, die Installation in ihrem Home-Verzeichnis durchzuführen. Wir empfehlen die Verwendung des dritten Ansatzes, da er am flexibelsten ist. Ein Skript „ plugandpaint.sh “ könnte beispielsweise wie folgt aussehen:

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`

dirname=`dirname $0`
tmp="${dirname#?}"

if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"

Wenn Sie dieses Skript anstelle der ausführbaren Datei ausführen, können Sie sicher sein, dass die Qt-Bibliotheken vom dynamischen Linker gefunden werden. Beachten Sie, dass Sie das Skript lediglich umbenennen müssen, um es mit anderen Anwendungen zu verwenden.

Bei der Suche nach Plugins durchsucht die Anwendung ein Unterverzeichnis „plugins“ im Verzeichnis der ausführbaren Anwendungsdatei. Entweder müssen Sie die Plugins manuell in das Verzeichnis „ plugins “ kopieren, oder Sie können in den Projektdateien der Plugins den Pfad „ DESTDIR “ festlegen:

DESTDIR = /path/to/Qt/plugandpaint/plugins

Ein Archiv, das alle Qt-Bibliotheken und alle Plugins enthält, die zum Ausführen der Anwendung „ plugandpaint “ erforderlich sind, müsste die folgenden Dateien enthalten:

KomponenteDateiname
Die ausführbare Dateiplugandpaint
Das Skript zum Ausführen der ausführbaren Dateiplugandpaint.sh
Das „Basic Tools“-Pluginplugins\libpnp_basictools.so
Das „ExtraFilters“-Pluginplugins\libpnp_extrafilters.so
Das Qt-xcb-Plattform-Pluginplatforms\libqxcb.so
Das Modul „ Qt Core “libQt6Core.so.6
Das Modul „ Qt GUI “libQt6Gui.so.6
Das Modul „ Qt Widgets “libQt6Widgets.so.6

Auf den meisten Systemen lautet die Erweiterung für gemeinsam genutzte Bibliotheken „ .so “. Eine bemerkenswerte Ausnahme bildet HP-UX, das „ .sl “ verwendet.

Beachten Sie, dass, wenn Ihre Anwendung von kompilatorspezifischen Bibliotheken abhängt, diese weiterhin zusammen mit Ihrer Anwendung weiterverbreitet werden müssen. Weitere Informationen finden Sie im Abschnitt „Anwendungsabhängigkeiten “.

Um zu überprüfen, ob die Anwendung nun erfolgreich bereitgestellt werden kann, können Sie dieses Archiv auf einem Rechner entpacken, auf dem weder Qt noch ein Compiler installiert ist, und versuchen, es auszuführen, d. h. das Skript „ plugandpaint.sh “ ausführen.

Eine Alternative zum Ablegen der Plugins im Unterverzeichnis „ plugins “ besteht darin, beim Starten Ihrer Anwendung mit „ QApplication::addLibraryPath()“ oder „ QApplication::setLibraryPaths()“ einen benutzerdefinierten Suchpfad hinzuzufügen.

QCoreApplication::addLibraryPath("/some/other/path");

Statische Verknüpfung

Die statische Verknüpfung ist oft die sicherste und einfachste Methode, eine Anwendung unter Unix zu verteilen, da sie Ihnen die Aufgabe erspart, die Qt-Bibliotheken zu verteilen und sicherzustellen, dass sie sich im Standard-Suchpfad für Bibliotheken auf dem Zielsystem befinden.

Statisches Erstellen von Qt

Um diesen Ansatz zu nutzen, müssen Sie zunächst eine _statische_ Version der Qt-Bibliotheken erstellen. Befolgen Sie die Schritte unter „Qt für Linux – Kompilieren aus dem Quellcode“, denken Sie jedoch daran, das Argument „ -static “ zu `configure` hinzuzufügen:

mkdir -p ~/dev/qt-build
cd ~/dev/qt-build
/tmp/qt-everywhere-src-6.12.0/configure -static

Die Anwendung mit der statischen Version von Qt verknüpfen

Sobald Qt statisch kompiliert ist, besteht der nächste Schritt darin, das Makefile neu zu generieren und die Anwendung neu zu kompilieren. Zunächst müssen wir in das Verzeichnis wechseln, das die Anwendung enthält:

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

Führen Sie nun `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
PATH=/path/to/Qt/bin:$PATH
export PATH
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. Beachten Sie, dass wir den Pfad zu dem soeben kompilierten statischen Qt festlegen müssen.

Um zu überprüfen, ob die Anwendung tatsächlich statisch mit Qt verknüpft ist, führen Sie das Tool ` ldd ` aus (auf den meisten Unix-Systemen verfügbar):

ldd ./application

Vergewissern Sie sich, dass die Qt-Bibliotheken in der Ausgabe nicht erwähnt werden.

Sofern nun alles fehlerfrei kompiliert und verknüpft wurde, sollten wir über eine „ plugandpaint “-Datei verfügen, die zur Bereitstellung bereit ist. Eine einfache Möglichkeit, um zu überprüfen, ob die Anwendung tatsächlich eigenständig ausgeführt werden kann, besteht darin, sie auf einen Rechner zu kopieren, auf dem weder Qt noch Qt-Anwendungen installiert sind, und sie dort auszuführen.

Beachten Sie, dass, falls Ihre Anwendung von kompilatorspezifischen Bibliotheken abhängt, diese weiterhin zusammen mit Ihrer Anwendung weiterverbreitet werden müssen. Weitere Informationen finden Sie im Abschnitt „Anwendungsabhängigkeiten “.

Das Beispiel „Plug & Paint“ besteht aus mehreren Komponenten: der Kernanwendung (Plug & Paint) sowie den Plugins „Basic Tools “ und „Extra Filters “. Da wir Plugins nicht über die statische Verknüpfung bereitstellen können, ist die bisher vorbereitete ausführbare Datei unvollständig. Die Anwendung läuft zwar, doch die Funktionalität ist aufgrund der fehlenden Plugins deaktiviert. Um pluginbasierte Anwendungen bereitzustellen, sollten wir den Ansatz mit gemeinsam genutzten Bibliotheken verwenden.

Anwendungsabhängigkeiten

Zusätzliche Bibliotheken

Um herauszufinden, von welchen Bibliotheken Ihre Anwendung abhängt, führen Sie das Tool „ ldd “ aus (auf den meisten Unix-Systemen verfügbar):

ldd ./application

Dadurch werden alle Abhängigkeiten Ihrer Anwendung von gemeinsam genutzten Bibliotheken aufgelistet. Je nach Konfiguration müssen diese Bibliotheken zusammen mit Ihrer Anwendung weiterverbreitet werden. Insbesondere muss die Standard-C++-Bibliothek weiterverbreitet werden, wenn Sie Ihre Anwendung mit einem Compiler kompilieren, der binärinkompatibel mit dem Systemcompiler ist. Wenn möglich, ist es am sichersten, diese Bibliotheken statisch einzubinden.

Wahrscheinlich wirst du die regulären X11-Bibliotheken dynamisch einbinden wollen, da einige Implementierungen versuchen, andere gemeinsam genutzte Bibliotheken mit ` dlopen()` zu öffnen, und wenn dies fehlschlägt, könnte die X11-Bibliothek einen Absturz deiner Anwendung verursachen.

Erwähnenswert ist auch, dass Qt nach bestimmten X11-Erweiterungen wie Xinerama und Xrandr sucht und diese möglicherweise einbindet – einschließlich aller Bibliotheken, mit denen sie verknüpft sind. Wenn Sie das Vorhandensein einer bestimmten Erweiterung nicht garantieren können, ist es am sichersten, diese bei der Konfiguration von Qt zu deaktivieren (zum Beispiel mit ` ./configure -no-xrandr`).

FontConfig und FreeType sind weitere Beispiele für Bibliotheken, die nicht immer verfügbar oder nicht immer binärkompatibel sind. So seltsam es auch klingen mag: Einige Softwareanbieter haben Erfolg damit gehabt, ihre Software auf sehr alten Rechnern zu kompilieren und dabei sehr darauf geachtet, keine der darauf laufenden Programme zu aktualisieren.

Wenn Sie Ihre Anwendung gegen die statischen Qt-Bibliotheken verknüpfen, müssen Sie die oben genannten abhängigen Bibliotheken explizit einbinden. Fügen Sie diese dazu der Variablen ` LIBS ` in Ihrer Projektdatei hinzu.

Qt-Plugins

Alle „ Qt GUI “-Anwendungen benötigen ein Plugin, das die Qt Platform Abstraction (QPA)-Schicht in Qt implementiert. Für Linux/X11 lautet der Name des Plattform-Plugins „ libqxcb.so “. 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) innerhalb Ihres Verteilungsverzeichnisses 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. Wie oben erwähnt, hat die Verwendung festgelegter Pfade gewisse Nachteile; daher sollten 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.

Anleitung: Erstellen eines DEB-Pakets

In diesem Abschnitt wird beschrieben, wie Sie mithilfe der in Qt 6.5 oder neuer verfügbaren CMake-Bereitstellungs-API ein DEB-Paket für Ihre Qt-Anwendung unter Linux erstellen. Es gibt kein spezielles „ linuxdeployqt “-Tool. Die aktuelle Lösung stützt sich ausschließlich auf die integrierten Funktionen von CMake.

Einrichtung des Beispielprojekts

Beginnen Sie mit einem einfachen CMake-Projekt:

cmake_minimum_required(VERSION 3.22)
project(MyApp)

find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_standard_project_setup()

qt_add_executable(MyApp main.cpp)
target_link_libraries(MyApp PRIVATE Qt::Widgets)

Schritt 1: Vorbereitung der Installation

Fügen Sie Befehle zur Installation der Anwendung und zur Erstellung eines Bereitstellungsskripts hinzu, um ein eigenständiges Verzeichnis zu erstellen:

# Install the executable to "${CMAKE_INSTALL_PREFIX}/bin".
install(TARGETS MyApp
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

# Generate the deployment script for MyApp.
qt_generate_deploy_app_script(
    TARGET MyApp
    FILENAME_VARIABLE deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)

# Run the deployment script during installation (on "cmake --install").
install(SCRIPT ${deploy_script})

Erstellen und installieren Sie das Projekt:

qt-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/tmp/my-application ..
cmake --build .
cmake --install .

Das Bereitstellungsskript:

  • Erstellt neben der ausführbaren Datei eine qt.conf-Datei, die Informationen zur Verzeichnisstruktur enthält. Diese wird zur Laufzeit benötigt, um die Plugins und Assets zu finden. Weitere Informationen finden Sie in der Dokumentation zu qt.conf.
  • Überprüft die ausführbare Datei und die verwendeten Qt-Plugins mithilfe der in CMake integrierten Funktion (GET_RUNTIME_DEPENDENCIES), um zu ermitteln, welche Qt-Bibliotheken bereitgestellt werden müssen.
  • Installiert die erforderlichen Qt-Plugins und Qt-Bibliotheken.

Das Installationsverzeichnis kann nun auf einen anderen Rechner kopiert werden, und die Anwendung sollte weiterhin funktionieren.

Schritt 2: Erstellen des DEB-Pakets

Nach der Installation packen Sie das Verzeichnis mit CPack. Fügen Sie Folgendes zu Ihrem CMake-Projekt hinzu:

set(CPACK_PACKAGE_NAME my-app)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My amazing application")
set(CPACK_PACKAGE_VENDOR "My Company")
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set(CPACK_VERBATIM_VARIABLES ON)
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/myapp")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Package Maintainer <maintainer@example.com>")
set(CPACK_DEBIAN_PACKAGE_DEPENDS libc6 libstdc++6 libgcc-s1)
include(CPack)

Konfigurieren Sie das Projekt neu, wechseln Sie in das Build-Verzeichnis (es muss die Datei „ CPackConfig.cmake “ enthalten) und führen Sie CPack aus, um das DEB-Paket zu erstellen:

cpack -G DEB

So überprüfen Sie den Inhalt des Pakets:

dpkg -c my_app-1.0-Linux.deb

So installieren Sie das Paket:

sudo dpkg -i my_app-1.0-Linux.deb

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