QLibrary Class
Die Klasse „QLibrary“ lädt gemeinsam genutzte Bibliotheken zur Laufzeit. Mehr dazu...
| Header: | #include <QLibrary> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Erbt von: | QObject |
- Liste aller Mitglieder, einschließlich der geerbten Mitglieder
- QLibrary ist Teil der Plugin-Klassen.
Hinweis: Alle Funktionen dieser Klasse sind reentrant.
Öffentliche Typen
| enum | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
| flags | LoadHints |
Eigenschaften
Öffentliche Funktionen
| QLibrary(QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr) | |
| virtual | ~QLibrary() |
| QString | errorString() const |
| QString | fileName() const |
| bool | isLoaded() const |
| bool | load() |
| QLibrary::LoadHints | loadHints() const |
| QFunctionPointer | resolve(const char *symbol) |
| void | setFileName(const QString &fileName) |
| void | setFileNameAndVersion(const QString &fileName, const QString &version) |
| void | setFileNameAndVersion(const QString &fileName, int versionNumber) |
| void | setLoadHints(QLibrary::LoadHints hints) |
| bool | unload() |
Statische öffentliche Mitglieder
| bool | isLibrary(const QString &fileName) |
| QFunctionPointer | resolve(const QString &fileName, const char *symbol) |
| QFunctionPointer | resolve(const QString &fileName, const QString &version, const char *symbol) |
| QFunctionPointer | resolve(const QString &fileName, int verNum, const char *symbol) |
Ausführliche Beschreibung
Eine Instanz eines QLibrary-Objekts arbeitet mit einer einzelnen gemeinsam genutzten Objektdatei (die wir als „Bibliothek“ bezeichnen, die aber auch als „DLL“ bekannt ist). Eine QLibrary bietet plattformunabhängigen Zugriff auf die Funktionen der Bibliothek. Sie können entweder einen Dateinamen im Konstruktor übergeben oder ihn explizit mit ` setFileName()` festlegen. Beim Laden der Bibliothek durchsucht QLibrary alle systemspezifischen Bibliotheksverzeichnisse (z. B. ` LD_LIBRARY_PATH ` unter Unix), es sei denn, der Dateiname enthält einen absoluten Pfad.
Ist der Dateiname ein absoluter Pfad, wird zunächst versucht, diesen Pfad zu laden. Kann die Datei nicht gefunden werden, probiert QLibrary den Namen mit verschiedenen plattformspezifischen Dateipräfixen aus, wie z. B. „lib“ unter Unix und auf dem Mac, sowie mit Suffixen wie „.so“ unter Unix, „.dylib“ auf dem Mac oder „.dll“ unter Windows.
Ist der Dateipfad nicht absolut, ändert QLibrary die Suchreihenfolge so, dass zuerst die systemspezifischen Präfixe und Suffixe ausprobiert werden, gefolgt vom angegebenen Dateipfad.
Dies ermöglicht es, gemeinsam genutzte Bibliotheken anzugeben, die nur durch ihren Basisnamen (d. h. ohne ihre Endung) identifiziert werden, sodass derselbe Code auf verschiedenen Betriebssystemen funktioniert und dennoch die Anzahl der Versuche, die Bibliothek zu finden, minimiert wird.
Die wichtigsten Funktionen sind ` load()` zum dynamischen Laden der Bibliotheksdatei, ` isLoaded()` zur Überprüfung, ob das Laden erfolgreich war, und ` resolve()` zum Auflösen eines Symbols in der Bibliothek. Die Funktion ` resolve()` versucht implizit, die Bibliothek zu laden, falls sie noch nicht geladen wurde. Es können mehrere Instanzen von QLibrary verwendet werden, um auf dieselbe physische Bibliothek zuzugreifen. Einmal geladen, verbleiben Bibliotheken im Speicher, bis die Anwendung beendet wird. Sie können versuchen, eine Bibliothek mit ` unload()` zu entladen; wenn jedoch andere Instanzen von QLibrary dieselbe Bibliothek verwenden, schlägt der Aufruf fehl, und das Entladen erfolgt erst, wenn jede Instanz ` unload()` aufgerufen hat.
Eine typische Anwendung von QLibrary besteht darin, ein exportiertes Symbol in einer Bibliothek aufzulösen und die C-Funktion aufzurufen, die dieses Symbol repräsentiert. Dies wird als „explizite Verknüpfung“ bezeichnet, im Gegensatz zur „impliziten Verknüpfung“, die im Rahmen des Build-Prozesses beim Verknüpfen einer ausführbaren Datei mit einer Bibliothek erfolgt.
Der folgende Codeausschnitt lädt eine Bibliothek, löst das Symbol „mysymbol“ auf und ruft die Funktion auf, wenn alles erfolgreich war. Wenn etwas schiefgeht, z. B. wenn die Bibliotheksdatei nicht existiert oder das Symbol nicht definiert ist, wird der Funktionszeiger auf ` nullptr ` gesetzt und nicht aufgerufen.
QLibrary myLib("mylib");
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
myFunction();Das Symbol muss als C-Funktion aus der Bibliothek exportiert werden, damit ` resolve()` funktioniert. Das bedeutet, dass die Funktion in einen ` extern "C" `-Block eingeschlossen werden muss, wenn die Bibliothek mit einem C++-Compiler kompiliert wird. Unter Windows erfordert dies zudem die Verwendung des Makros „ dllexport “; Einzelheiten dazu finden Sie unter „ resolve()“. Der Einfachheit halber gibt es eine statische Funktion „ resolve()“, die Sie verwenden können, wenn Sie lediglich eine Funktion in einer Bibliothek aufrufen möchten, ohne die Bibliothek zuvor explizit zu laden:
typedef void (*MyPrototype)();
MyPrototype myFunction =
(MyPrototype) QLibrary::resolve("mylib", "mysymbol");
if (myFunction)
myFunction();Siehe auch QPluginLoader.
Dokumentation zu Mitgliedstypen
enum QLibrary::LoadHint
flags QLibrary::LoadHints
Diese Enumeration beschreibt die möglichen Hinweise, mit denen die Art und Weise geändert werden kann, wie Bibliotheken beim Laden behandelt werden. Diese Werte geben an, wie Symbole beim Laden von Bibliotheken aufgelöst werden, und werden mithilfe der Funktion ` setLoadHints()` festgelegt.
| Konstante | Wert | Beschreibung |
|---|---|---|
QLibrary::ResolveAllSymbolsHint | 0x01 | Bewirkt, dass alle Symbole in einer Bibliothek bereits beim Laden aufgelöst werden und nicht erst beim Aufruf von ` resolve()`. |
QLibrary::ExportExternalSymbolsHint | 0x02 | Exportiert unaufgelöste und externe Symbole der Bibliothek, damit sie in anderen, später geladenen, dynamisch geladenen Bibliotheken aufgelöst werden können. |
QLibrary::LoadArchiveMemberHint | 0x04 | Ermöglicht es, im Dateinamen der Bibliothek eine bestimmte Objektdatei innerhalb einer Archivdatei anzugeben. Wird dieser Hinweis angegeben, besteht der Dateiname der Bibliothek aus einem Pfad, der auf eine Archivdatei verweist, gefolgt von einem Verweis auf das Archivelement. |
QLibrary::PreventUnloadHint | 0x08 | Verhindert, dass die Bibliothek aus dem Adressraum entladen wird, wenn `close()` aufgerufen wird. Die statischen Variablen der Bibliothek werden nicht neu initialisiert, wenn `open()` zu einem späteren Zeitpunkt aufgerufen wird. |
QLibrary::DeepBindHint | 0x10 | Weist den Linker an, beim Auflösen externer Symbole in der geladenen Bibliothek Definitionen in der geladenen Bibliothek gegenüber exportierten Definitionen in der ladenden Anwendung den Vorzug zu geben. Diese Option wird nur unter Linux unterstützt. |
Der Typ „LoadHints“ ist ein `typedef` für ` QFlags<LoadHint>`. Er speichert eine ODER-Kombination von `LoadHint`-Werten.
Siehe auch „ loadHints “.
Dokumentation zu Eigenschaften
fileName : QString
Diese Eigenschaft enthält den Dateinamen der Bibliothek
Wir empfehlen, die Dateiendung im Dateinamen wegzulassen, da QLibrary automatisch nach der Datei mit der entsprechenden Endung sucht (siehe isLibrary()).
Beim Laden der Bibliothek durchsucht QLibrary alle systemspezifischen Bibliotheksverzeichnisse (z. B. LD_LIBRARY_PATH unter Unix), sofern der Dateiname keinen absoluten Pfad enthält. Nach erfolgreichem Laden der Bibliothek gibt fileName() den vollqualifizierten Dateinamen der Bibliothek zurück, einschließlich des vollständigen Pfads zur Bibliothek, sofern dieser im Konstruktor angegeben oder an setFileName() übergeben wurde.
Beispielsweise gibt fileName() nach dem erfolgreichen Laden der Bibliothek „GL“ auf Unix-Plattformen „libGL.so“ zurück. Wurde der Dateiname ursprünglich als „/usr/lib/libGL“ übergeben, gibt fileName() „/usr/lib/libGL.so“ zurück.
Zugriffsfunktionen:
| QString | fileName() const |
| void | setFileName(const QString &fileName) |
loadHints : LoadHints
Geben Sie der Funktion ` load()` einige Hinweise dazu, wie sie sich verhalten soll.
Sie können Hinweise dazu geben, wie die Symbole aufgelöst werden sollen. Normalerweise werden die Symbole nicht bereits beim Laden aufgelöst, sondern erst bei Bedarf (d. h. beim Aufruf von ` resolve()`). Wenn Sie `loadHints` auf ` ResolveAllSymbolsHint` setzen, werden alle Symbole bereits beim Laden aufgelöst, sofern die Plattform dies unterstützt.
Durch die Einstellung „ ExportExternalSymbolsHint “ werden die externen Symbole in der Bibliothek für die Auflösung in nachfolgend geladenen Bibliotheken verfügbar gemacht.
Wenn „ LoadArchiveMemberHint “ gesetzt ist, setzt sich der Dateiname aus zwei Komponenten zusammen: Ein Pfad, der auf eine Archivdatei verweist, gefolgt von der zweiten Komponente, die auf das Archivelement verweist. Beispielsweise verweist die „ fileName “ libGL.a(shr_64.o) auf die Bibliothek shr_64.o in der Archivdatei namens libGL.a. Dies wird nur auf der AIX-Plattform unterstützt.
Die Interpretation der Ladhinweise ist plattformabhängig. Wenn Sie diese verwenden, gehen Sie wahrscheinlich von bestimmten Annahmen hinsichtlich der Plattform aus, für die Sie kompilieren. Verwenden Sie sie daher nur, wenn Sie deren Auswirkungen verstehen.
Standardmäßig ist keines dieser Flags gesetzt, sodass Bibliotheken mit verzögerter Symbolauflösung geladen werden und keine externen Symbole zur Auflösung in anderen dynamisch geladenen Bibliotheken exportieren.
Hinweis: Hinweise können nur gelöscht werden, wenn dieses Objekt nicht mit einer Datei verknüpft ist. Hinweise können erst hinzugefügt werden, sobald der Dateiname festgelegt ist (hints wird mit den alten Hinweisen logisch „oder“ verknüpft).
Hinweis: Das Setzen dieser Eigenschaft nach dem Laden der Bibliothek hat keine Wirkung, und loadHints() berücksichtigt diese Änderungen nicht.
Hinweis: Diese Eigenschaft wird von allen „ QLibrary “-Instanzen gemeinsam genutzt, die auf dieselbe Bibliothek verweisen.
Zugriffsfunktionen:
| QLibrary::LoadHints | loadHints() const |
| void | setLoadHints(QLibrary::LoadHints hints) |
Dokumentation zu den Member-Funktionen
[explicit] QLibrary::QLibrary(QObject *parent = nullptr)
Erstellt eine Bibliothek mit dem angegebenen „ parent “.
[explicit] QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
Erstellt ein Bibliotheksobjekt mit dem angegebenen ` parent `, das die durch ` fileName` angegebene Bibliothek lädt.
Wir empfehlen, die Dateiendung in ` fileName` wegzulassen, da QLibrary automatisch nach der Datei mit der für die jeweilige Plattform passenden Endung sucht, z. B. „.so“ unter Unix, „.dylib“ unter macOS und iOS sowie „.dll“ unter Windows. (Siehe fileName.)
[explicit] QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
Erstellt ein Bibliotheksobjekt mit dem angegebenen „ parent “, das die durch „ fileName “ angegebene Bibliothek sowie die vollständige Versionsnummer „ version “ lädt. Derzeit wird die Versionsnummer unter Windows ignoriert.
Wir empfehlen, die Dateiendung in fileName wegzulassen, da QLibrary automatisch nach der Datei mit der plattformgerechten Endung sucht, z. B. „.so“ unter Unix, „.dylib“ unter macOS und iOS sowie „.dll“ unter Windows. (Siehe fileName.)
[explicit] QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
Erstellt ein Bibliotheksobjekt mit dem angegebenen „ parent “, das die durch „ fileName “ angegebene Bibliothek mit der Hauptversionsnummer „ verNum “ lädt. Derzeit wird die Versionsnummer unter Windows ignoriert.
Wir empfehlen, die Dateiendung in ` fileName` wegzulassen, da QLibrary automatisch nach der Datei mit der für die jeweilige Plattform passenden Endung sucht, z. B. „.so“ unter Unix, „.dylib“ unter macOS und iOS sowie „.dll“ unter Windows. (Siehe fileName.)
[virtual noexcept] QLibrary::~QLibrary()
Löscht das QLibrary -Objekt.
Sofern ` unload()` nicht explizit aufgerufen wurde, verbleibt die Bibliothek im Speicher, bis die Anwendung beendet wird.
Siehe auch ` isLoaded()` und ` unload()`.
QString QLibrary::errorString() const
Gibt eine Textzeichenfolge mit der Beschreibung des zuletzt aufgetretenen Fehlers zurück. Derzeit wird „errorString“ nur gesetzt, wenn „ load()“, „ unload()“ oder „ resolve()“ aus irgendeinem Grund fehlschlägt.
[static] bool QLibrary::isLibrary(const QString &fileName)
Gibt „ true “ zurück, wenn „ fileName “ ein gültiges Suffix für eine ladbare Bibliothek enthält; andernfalls wird „ false “ zurückgegeben.
| Plattform | Gültige Suffixe |
|---|---|
| Windows | .dll, .DLL |
| Unix/Linux | .so |
| AIX | .a |
| HP-UX | .sl, .so (HP-UXi) |
| macOS und iOS | .dylib, .bundle, .so |
Anhängende Versionsnummern unter Unix werden ignoriert.
bool QLibrary::isLoaded() const
Gibt „ true “ zurück, wenn „ load()“ erfolgreich war; andernfalls wird „ false “ zurückgegeben.
Hinweis: Vor Qt 6.6 gab diese Funktion auch ohne Aufruf von ` load()` ` true ` zurück, wenn ein anderes ` QLibrary `-Objekt in derselben Bibliothek dafür gesorgt hatte, dass sie geladen wurde.
Siehe auch ` load()`.
bool QLibrary::load()
Lädt die Bibliothek und gibt „ true “ zurück, wenn die Bibliothek erfolgreich geladen wurde; andernfalls wird „ false “ zurückgegeben. Da „ resolve()“ diese Funktion immer aufruft, bevor Symbole aufgelöst werden, ist es nicht notwendig, sie explizit aufzurufen. In manchen Situationen möchten Sie möglicherweise, dass die Bibliothek im Voraus geladen wird; in diesem Fall würden Sie diese Funktion verwenden.
Siehe auch ` unload()`.
QFunctionPointer QLibrary::resolve(const char *symbol)
Gibt die Adresse des exportierten Symbols „ symbol “ zurück. Die Bibliothek wird bei Bedarf geladen. Die Funktion gibt „ nullptr “ zurück, wenn das Symbol nicht aufgelöst werden konnte oder die Bibliothek nicht geladen werden konnte.
Beispiel:
typedef int (*AvgFunction)(int, int);
AvgFunction avg = (AvgFunction) library->resolve("avg");
if (avg)
return avg(5, 8);
else
return -1;Das Symbol muss als C-Funktion aus der Bibliothek exportiert werden. Das bedeutet, dass die Funktion in eine ` extern "C" ` eingeschlossen werden muss, wenn die Bibliothek mit einem C++-Compiler kompiliert wird. Unter Windows müssen Sie die Funktion außerdem explizit mithilfe der Compiler-Direktive ` __declspec(dllexport) ` aus der DLL exportieren, zum Beispiel:
extern "C" MY_EXPORT int avg(int a, int b)
{
return (a + b) / 2;
}wobei ` MY_EXPORT ` wie folgt definiert ist:
#ifdef Q_OS_WIN
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)
Lädt die Bibliothek „ fileName “ und gibt die Adresse des exportierten Symbols „ symbol “ zurück. Beachten Sie, dass „ fileName “ kein plattformspezifisches Dateiendung enthalten darf (siehe fileName). Die Bibliothek bleibt geladen, bis die Anwendung beendet wird.
Die Funktion gibt nullptr zurück, wenn das Symbol nicht aufgelöst werden konnte oder die Bibliothek nicht geladen werden konnte.
Dies ist eine überladene Funktion.
Siehe auch resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
Lädt die Bibliothek „ fileName “ mit der vollständigen Versionsnummer „ version “ und gibt die Adresse des exportierten Symbols „ symbol “ zurück. Beachten Sie, dass „ fileName “ keine plattformspezifische Dateiendung enthalten sollte (siehe fileName). Die Bibliothek bleibt geladen, bis die Anwendung beendet wird. „ version “ wird unter Windows ignoriert.
Die Funktion gibt „ nullptr “ zurück, wenn das Symbol nicht aufgelöst oder die Bibliothek nicht geladen werden konnte.
Dies ist eine überladene Funktion.
Siehe auch resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
Lädt die Bibliothek „ fileName “ mit der Hauptversionsnummer „ verNum “ und gibt die Adresse des exportierten Symbols „ symbol “ zurück. Beachten Sie, dass „ fileName “ keine plattformspezifische Dateiendung enthalten sollte (siehe fileName). Die Bibliothek bleibt geladen, bis die Anwendung beendet wird. „ verNum “ wird unter Windows ignoriert.
Die Funktion gibt ` nullptr ` zurück, wenn das Symbol nicht aufgelöst oder die Bibliothek nicht geladen werden konnte.
Dies ist eine überladene Funktion.
Siehe auch ` resolve()`.
void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &version)
Setzt die Eigenschaft „ fileName “ und die vollständige Versionsnummer auf „ fileName “ bzw. „ version “. Der Parameter „ version “ wird unter Windows ignoriert.
Siehe auch setFileName().
void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)
Setzt die Eigenschaft „ fileName “ sowie die Hauptversionsnummer auf „ fileName “ bzw. „ versionNumber “. Die Eigenschaft „ versionNumber “ wird unter Windows ignoriert.
Siehe auch setFileName().
bool QLibrary::unload()
Lädt die Bibliothek ab und gibt „ true “ zurück, wenn die Bibliothek erfolgreich abgeladen werden konnte; andernfalls wird „ false “ zurückgegeben.
Dies geschieht automatisch beim Beenden der Anwendung, sodass Sie diese Funktion normalerweise nicht aufrufen müssen.
Wenn andere Instanzen von ` QLibrary ` dieselbe Bibliothek verwenden, schlägt der Aufruf fehl, und das Entladen erfolgt erst, wenn jede Instanz `unload()` aufgerufen hat.
Beachten Sie, dass unter macOS dynamische Bibliotheken nicht entladen werden können. `QLibrary::unload()` gibt ` true` zurück, die Bibliothek bleibt jedoch im Prozess geladen.
© 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.