QLibrary Class
Die Klasse QLibrary lädt gemeinsam genutzte Bibliotheken zur Laufzeit. Mehr...
Kopfzeile: | #include <QLibrary> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Vererbungen: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QLibrary ist Teil der Plugin-Klassen.
Hinweis: Alle Funktionen in 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) |
Detaillierte Beschreibung
Eine Instanz eines QLibrary-Objekts arbeitet mit einer einzigen gemeinsam genutzten Objektdatei (die wir als "Bibliothek" bezeichnen, die aber auch als "DLL" bekannt ist). Eine QLibrary bietet plattformunabhängigen Zugriff auf die Funktionalität der Bibliothek. Sie können entweder einen Dateinamen im Konstruktor übergeben, oder ihn explizit mit setFileName() setzen. Beim Laden der Bibliothek sucht QLibrary in allen systemspezifischen Bibliotheksspeicherorten (z.B. LD_LIBRARY_PATH
unter Unix), es sei denn, der Dateiname hat einen absoluten Pfad.
Wenn der Dateiname ein absoluter Pfad ist, wird versucht, diesen Pfad zuerst zu laden. Wenn die Datei nicht gefunden werden kann, versucht QLibrary den Namen mit verschiedenen plattformspezifischen Dateipräfixen, wie "lib" unter Unix und Mac, und Suffixen, wie ".so" unter Unix, ".dylib" auf dem Mac oder ".dll" unter Windows.
Wenn der Dateipfad nicht absolut ist, ändert QLibrary die Suchreihenfolge so, dass zuerst die systemspezifischen Präfixe und Suffixe ausprobiert werden, gefolgt von dem angegebenen Dateipfad.
Dadurch ist es möglich, gemeinsam genutzte Bibliotheken zu spezifizieren, die nur durch ihren Basisnamen identifiziert werden (d.h. ohne Suffix), so dass derselbe Code auf verschiedenen Betriebssystemen funktioniert und trotzdem 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() zur Auflösung eines Symbols in der Bibliothek. Die Funktion resolve() versucht implizit, die Bibliothek zu laden, wenn sie noch nicht geladen wurde. Mehrere Instanzen von QLibrary können verwendet werden, um auf dieselbe physische Bibliothek zuzugreifen. Einmal geladene Bibliotheken bleiben im Speicher, bis die Anwendung beendet wird. Sie können versuchen, eine Bibliothek mit unload() zu entladen, aber wenn andere Instanzen von QLibrary dieselbe Bibliothek verwenden, wird der Aufruf fehlschlagen, und das Entladen wird erst erfolgen, wenn jede Instanz unload() aufgerufen hat.
Eine typische Verwendung von QLibrary ist es, ein exportiertes Symbol in einer Bibliothek aufzulösen und die C-Funktion aufzurufen, die dieses Symbol repräsentiert. Dies wird als "explizites Linken" bezeichnet, im Gegensatz zum "impliziten Linken", das durch den Link-Schritt im Build-Prozess erfolgt, wenn eine ausführbare Datei gegen eine Bibliothek gelinkt wird.
Der folgende Codeschnipsel lädt eine Bibliothek, löst das Symbol "mysymbol" auf und ruft die Funktion auf, wenn alles erfolgreich war. Wenn etwas schief geht, z.B. die Bibliotheksdatei nicht existiert oder das Symbol nicht definiert ist, wird der Funktionszeiger nullptr
sein und nicht aufgerufen werden.
QLibrary myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); if (myFunction) myFunction();
Damit resolve() funktioniert, muss das Symbol als C-Funktion aus der Bibliothek exportiert werden. Das bedeutet, dass die Funktion in einen extern "C"
Block eingeschlossen werden muss, wenn die Bibliothek mit einem C++ Compiler kompiliert wurde. Unter Windows erfordert dies auch die Verwendung eines dllexport
Makros; siehe resolve() für die Details, wie dies gemacht wird. Der Einfachheit halber gibt es eine statische resolve()-Funktion, die Sie verwenden können, wenn Sie nur eine Funktion in einer Bibliothek aufrufen wollen, ohne die Bibliothek vorher explizit zu laden:
typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) QLibrary::resolve("mylib", "mysymbol"); if (myFunction) myFunction();
Siehe auch QPluginLoader.
Dokumentation der Mitgliedstypen
enum QLibrary::LoadHint
flags QLibrary::LoadHints
Diese Aufzählung beschreibt die möglichen Hinweise, die verwendet werden können, um die Art und Weise zu ändern, wie Bibliotheken behandelt werden, wenn sie geladen werden. Diese Werte geben an, wie Symbole aufgelöst werden, wenn Bibliotheken geladen werden, und werden mit der Funktion setLoadHints() angegeben.
Konstante | Wert | Beschreibung |
---|---|---|
QLibrary::ResolveAllSymbolsHint | 0x01 | Bewirkt, dass alle Symbole in einer Bibliothek aufgelöst werden, wenn sie geladen wird, und nicht nur, wenn resolve() aufgerufen wird. |
QLibrary::ExportExternalSymbolsHint | 0x02 | Exportiert nicht aufgelöste und externe Symbole in der Bibliothek, damit sie in anderen dynamisch geladenen Bibliotheken, die später geladen werden, aufgelöst werden können. |
QLibrary::LoadArchiveMemberHint | 0x04 | Erlaubt die Angabe des Dateinamens der Bibliothek, um eine bestimmte Objektdatei innerhalb einer Archivdatei anzugeben. Wenn dieser Hinweis gegeben wird, besteht der Dateiname der Bibliothek aus einem Pfad, der ein Verweis auf eine Archivdatei ist, gefolgt von einem Verweis auf das Archivmitglied. |
QLibrary::PreventUnloadHint | 0x08 | Verhindert, dass die Bibliothek aus dem Adressraum entladen wird, wenn close() aufgerufen wird. Die statischen Variablen der Bibliothek werden nicht reinitialisiert, wenn open() zu einem späteren Zeitpunkt aufgerufen wird. |
QLibrary::DeepBindHint | 0x10 | Weist den Linker an, Definitionen in der geladenen Bibliothek gegenüber exportierten Definitionen in der ladenden Anwendung zu bevorzugen, wenn externe Symbole in der geladenen Bibliothek aufgelöst werden. Diese Option wird nur unter Linux unterstützt. |
Der Typ LoadHints ist ein Typedef für QFlags<LoadHint>. Er speichert eine OR-Kombination von LoadHint-Werten.
Siehe auch loadHints.
Dokumentation der Eigenschaft
fileName : QString
Diese Eigenschaft enthält den Dateinamen der Bibliothek
Es wird empfohlen, das Suffix der Datei im Dateinamen wegzulassen, da QLibrary automatisch nach der Datei mit dem entsprechenden Suffix sucht (siehe isLibrary()).
Beim Laden der Bibliothek sucht QLibrary in allen systemspezifischen Bibliotheksspeicherorten (z. B. LD_LIBRARY_PATH
unter Unix), es sei denn, der Dateiname hat einen absoluten Pfad. Nach erfolgreichem Laden der Bibliothek gibt fileName() den vollqualifizierten Dateinamen der Bibliothek zurück, einschließlich des vollständigen Pfads zur Bibliothek, falls dieser im Konstruktor angegeben oder an setFileName() übergeben wurde.
Nach erfolgreichem Laden der "GL"-Bibliothek auf Unix-Plattformen gibt fileName() zum Beispiel "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, wie sie sich verhalten soll.
Sie können Hinweise geben, wie die Symbole aufgelöst werden. Normalerweise werden die Symbole nicht zum Zeitpunkt des Ladens aufgelöst, sondern erst nach und nach (d. h. beim Aufruf von resolve()). Wenn Sie loadHints auf ResolveAllSymbolsHint setzen, werden alle Symbole zum Zeitpunkt des Ladens aufgelöst, sofern die Plattform dies unterstützt.
Die Einstellung ExportExternalSymbolsHint macht die externen Symbole in der Bibliothek für die Auflösung in nachfolgenden geladenen Bibliotheken verfügbar.
Wenn LoadArchiveMemberHint eingestellt ist, setzt sich der Dateiname aus zwei Komponenten zusammen: Einem Pfad, der ein Verweis auf eine Archivdatei ist, gefolgt von der zweiten Komponente, die der Verweis auf das Archivmitglied ist. So verweist beispielsweise fileName libGL.a(shr_64.o)
auf die Bibliothek shr_64.o
in der Archivdatei mit dem Namen libGL.a
. Dies wird nur auf der AIX-Plattform unterstützt.
Die Interpretation der Ladehinweise ist plattformabhängig, und wenn Sie sie verwenden, machen Sie wahrscheinlich einige Annahmen darüber, für welche Plattform Sie kompilieren, also verwenden Sie sie nur, wenn Sie die Konsequenzen davon verstehen.
Standardmäßig ist keines dieser Flags gesetzt, so dass Bibliotheken mit Lazy-Symbol-Auflö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 nur hinzugefügt werden, wenn der Dateiname gesetzt ist (hints wird mit den alten Hinweisen or'ed).
Hinweis: Das Setzen dieser Eigenschaft nach dem Laden der Bibliothek hat keinen Effekt und loadHints() wird diese Änderungen nicht berücksichtigen.
Hinweis: Diese Eigenschaft wird von allen QLibrary Instanzen geteilt, die auf dieselbe Bibliothek verweisen.
Zugriffsfunktionen:
QLibrary::LoadHints | loadHints() const |
void | setLoadHints(QLibrary::LoadHints hints) |
Dokumentation der Mitgliedsfunktionen
[explicit]
QLibrary::QLibrary(QObject *parent = nullptr)
Konstruiert eine Bibliothek mit der angegebenen parent.
[explicit]
QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
Konstruiert ein Library-Objekt mit der angegebenen parent, das die durch fileName angegebene Library lädt.
Wir empfehlen, das Suffix der Datei in fileName wegzulassen, da QLibrary automatisch nach der Datei mit dem entsprechenden Suffix in Übereinstimmung mit der Plattform sucht, z.B. ".so" unter Unix, ".dylib" unter macOS und iOS und ".dll" unter Windows. (Siehe fileName.)
[explicit]
QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
Konstruiert ein Bibliotheksobjekt mit der angegebenen parent, das die durch fileName angegebene Bibliothek und die vollständige Versionsnummer version lädt. Derzeit wird die Versionsnummer unter Windows ignoriert.
Wir empfehlen, das Suffix der Datei in fileName wegzulassen, da QLibrary automatisch nach der Datei mit dem entsprechenden Suffix in Übereinstimmung mit der Plattform sucht, z. B. ".so" unter Unix, ".dylib" unter macOS und iOS und ".dll" unter Windows. (Siehe fileName.)
[explicit]
QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
Konstruiert ein Bibliotheksobjekt mit der angegebenen parent, das die durch fileName angegebene Bibliothek und die Hauptversionsnummer verNum lädt. Derzeit wird die Versionsnummer unter Windows ignoriert.
Wir empfehlen, das Suffix der Datei in fileName wegzulassen, da QLibrary automatisch nach der Datei mit dem entsprechenden Suffix in Übereinstimmung mit der Plattform sucht, z.B. ".so" unter Unix, ".dylib" unter macOS und iOS und ".dll" unter Windows. (Siehe fileName.)
[virtual noexcept]
QLibrary::~QLibrary()
Zerstört das Objekt QLibrary.
Sofern unload() nicht explizit aufgerufen wurde, bleibt die Bibliothek im Speicher, bis die Anwendung beendet wird.
Siehe auch isLoaded() und unload().
QString QLibrary::errorString() const
Gibt einen Textstring mit der Beschreibung des letzten 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 hat; 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 |
Nachfolgende 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 true
auch ohne einen Aufruf von load() zurück, wenn ein anderes QLibrary -Objekt in derselben Bibliothek das Laden der Bibliothek verursacht hatte.
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 irgendwelche Symbole aufgelöst werden, ist es nicht notwendig, sie explizit aufzurufen. In manchen Situationen möchten Sie vielleicht, 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. Falls erforderlich, wird die Bibliothek geladen. Die Funktion gibt nullptr
zurück, wenn das Symbol nicht aufgelöst werden konnte oder wenn 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 ein extern "C"
eingeschlossen werden muss, wenn die Bibliothek mit einem C++-Compiler kompiliert wurde. Unter Windows müssen Sie die Funktion auch explizit aus der DLL exportieren, indem Sie z. B. die Compiler-Direktive __declspec(dllexport)
verwenden:
extern "C" MY_EXPORT int avg(int a, int b) { return (a + b) / 2; }
mit MY_EXPORT
definiert als
#ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)
Dies ist eine überladene Funktion.
Lädt die Bibliothek fileName und gibt die Adresse des exportierten Symbols symbol zurück. Beachten Sie, dass fileName nicht das plattformspezifische Dateisuffix enthalten sollte; (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 wenn die Bibliothek nicht geladen werden konnte.
Siehe auch resolve().
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
Dies ist eine überladene Funktion.
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 nicht das plattformspezifische Dateisuffix 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 werden konnte oder wenn die Bibliothek nicht geladen werden konnte.
Siehe auch resolve().
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
Dies ist eine überladene Funktion.
Lädt die Bibliothek fileName mit der Hauptversionsnummer verNum und gibt die Adresse des exportierten Symbols symbol zurück. Beachten Sie, dass fileName nicht das plattformspezifische Dateisuffix 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 werden konnte oder wenn die Bibliothek nicht geladen werden konnte.
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 und die Hauptversionsnummer auf fileName bzw. versionNumber. Die Eigenschaft versionNumber wird unter Windows ignoriert.
Siehe auch setFileName().
bool QLibrary::unload()
Entlädt die Bibliothek und gibt true
zurück, wenn die Bibliothek entladen werden konnte; andernfalls wird false
zurückgegeben.
Dies geschieht automatisch beim Beenden der Anwendung, so dass 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() wird true
zurückgeben, aber die Bibliothek bleibt in den Prozess geladen.
© 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.