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

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.

KonstanteWertBeschreibung
QLibrary::ResolveAllSymbolsHint0x01Bewirkt, dass alle Symbole in einer Bibliothek aufgelöst werden, wenn sie geladen wird, und nicht nur, wenn resolve() aufgerufen wird.
QLibrary::ExportExternalSymbolsHint0x02Exportiert 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::LoadArchiveMemberHint0x04Erlaubt 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::PreventUnloadHint0x08Verhindert, 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::DeepBindHint0x10Weist 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.

PlattformGü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.

Siehe auch resolve() und load().

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