QLibrary Class
La classe QLibrary charge les bibliothèques partagées au moment de l'exécution. Plus d'informations...
| En-tête : | #include <QLibrary> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Héritages : | QObject |
- Liste de tous les membres, y compris les membres hérités
- QLibrary fait partie de Plugin Classes.
Remarque : toutes les fonctions de cette classe sont réentrantes.
Types publics
| enum | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
| flags | LoadHints |
Propriétés
Fonctions publiques
| 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() |
Membres publics statiques
| 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) |
Description détaillée
Une instance d'un objet QLibrary opère sur un seul fichier objet partagé (que nous appelons "bibliothèque", mais qui est également connu sous le nom de "DLL"). Une bibliothèque Q permet d'accéder aux fonctionnalités de la bibliothèque d'une manière indépendante de la plate-forme. Vous pouvez soit transmettre un nom de fichier dans le constructeur, soit le définir explicitement à l'aide de setFileName(). Lors du chargement de la bibliothèque, QLibrary cherche dans tous les emplacements de bibliothèque spécifiques au système (par exemple LD_LIBRARY_PATH sous Unix), à moins que le nom du fichier ne contienne un chemin absolu.
Si le nom du fichier est un chemin absolu, une tentative est faite pour charger ce chemin en premier. Si le fichier est introuvable, QLibrary essaie le nom avec différents préfixes de fichier spécifiques à la plate-forme, comme "lib" sous Unix et Mac, et des suffixes, comme ".so" sous Unix, ".dylib" sous Mac, ou ".dll" sous Windows.
Si le chemin d'accès au fichier n'est pas absolu, QLibrary modifie l'ordre de recherche pour essayer d'abord les préfixes et suffixes spécifiques au système, puis le chemin d'accès au fichier spécifié.
Cela permet de spécifier des bibliothèques partagées qui ne sont identifiées que par leur nom de base (c'est-à-dire sans leur suffixe), de sorte que le même code fonctionnera sur différents systèmes d'exploitation tout en minimisant le nombre de tentatives pour trouver la bibliothèque.
Les fonctions les plus importantes sont load() pour charger dynamiquement le fichier de la bibliothèque, isLoaded() pour vérifier si le chargement a réussi et resolve() pour résoudre un symbole dans la bibliothèque. La fonction resolve() tente implicitement de charger la bibliothèque si elle ne l'a pas encore été. Plusieurs instances de QLibrary peuvent être utilisées pour accéder à la même bibliothèque physique. Une fois chargées, les bibliothèques restent en mémoire jusqu'à ce que l'application se termine. Vous pouvez tenter de décharger une bibliothèque en utilisant unload(), mais si d'autres instances de QLibrary utilisent la même bibliothèque, l'appel échouera et le déchargement n'aura lieu que lorsque chaque instance aura appelé unload().
Une utilisation typique de QLibrary est de résoudre un symbole exporté dans une bibliothèque et d'appeler la fonction C que ce symbole représente. C'est ce qu'on appelle "l'établissement de liens explicites", par opposition à "l'établissement de liens implicites", qui est effectué par l'étape d'établissement de liens dans le processus de construction lors de l'établissement de liens entre un exécutable et une bibliothèque.
L'extrait de code suivant charge une bibliothèque, résout le symbole "mysymbol" et appelle la fonction si tout s'est déroulé correctement. Si quelque chose ne va pas, par exemple si le fichier de la bibliothèque n'existe pas ou si le symbole n'est pas défini, le pointeur de la fonction sera nullptr et ne sera pas appelé.
QLibrary myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); if (myFunction) myFunction();
Le symbole doit être exporté en tant que fonction C de la bibliothèque pour que resolve() fonctionne. Cela signifie que la fonction doit être enveloppée dans un bloc extern "C" si la bibliothèque est compilée avec un compilateur C++. Sous Windows, cela nécessite également l'utilisation d'une macro dllexport; voir resolve() pour plus de détails sur la manière de procéder. Pour plus de commodité, il existe une fonction statique resolve() que vous pouvez utiliser si vous souhaitez simplement appeler une fonction dans une bibliothèque sans charger explicitement la bibliothèque au préalable :
typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) QLibrary::resolve("mylib", "mysymbol"); if (myFunction) myFunction();
Voir aussi QPluginLoader.
Documentation des types de membres
enum QLibrary::LoadHint
flags QLibrary::LoadHints
Cette énumération décrit les indications possibles qui peuvent être utilisées pour modifier la manière dont les bibliothèques sont gérées lorsqu'elles sont chargées. Ces valeurs indiquent comment les symboles sont résolus lors du chargement des bibliothèques et sont spécifiées à l'aide de la fonction setLoadHints().
| Constante | Valeur | Description |
|---|---|---|
QLibrary::ResolveAllSymbolsHint | 0x01 | Tous les symboles d'une bibliothèque sont résolus lors de son chargement, et pas seulement lors de l'appel de la fonction resolve(). |
QLibrary::ExportExternalSymbolsHint | 0x02 | Exporte les symboles non résolus et externes de la bibliothèque afin qu'ils puissent être résolus dans d'autres bibliothèques à chargement dynamique chargées ultérieurement. |
QLibrary::LoadArchiveMemberHint | 0x04 | Permet au nom de fichier de la bibliothèque de spécifier un fichier objet particulier dans un fichier d'archive. Si cette indication est donnée, le nom de fichier de la bibliothèque se compose d'un chemin, qui est une référence à un fichier d'archive, suivi d'une référence au membre de l'archive. |
QLibrary::PreventUnloadHint | 0x08 | Empêche la bibliothèque d'être déchargée de l'espace d'adressage si la fonction close() est appelée. Les variables statiques de la bibliothèque ne sont pas réinitialisées si open() est appelé ultérieurement. |
QLibrary::DeepBindHint | 0x10 | Indique à l'éditeur de liens de préférer les définitions de la bibliothèque chargée aux définitions exportées dans l'application de chargement lors de la résolution des symboles externes dans la bibliothèque chargée. Cette option n'est prise en charge que sous Linux. |
Le type LoadHints est un typedef pour QFlags<LoadHint>. Il stocke une combinaison OU de valeurs LoadHint.
Voir également loadHints.
Documentation sur les propriétés
fileName : QString
Cette propriété contient le nom de fichier de la bibliothèque
Il est recommandé d'omettre le suffixe du fichier dans le nom du fichier, car QLibrary recherchera automatiquement le fichier avec le suffixe approprié (voir isLibrary()).
Lors du chargement de la bibliothèque, QLibrary recherche dans tous les emplacements de bibliothèque spécifiques au système (par exemple, LD_LIBRARY_PATH sous Unix), à moins que le nom du fichier ne comporte un chemin d'accès absolu. Une fois la bibliothèque chargée avec succès, fileName() renvoie le nom de fichier entièrement qualifié de la bibliothèque, y compris le chemin d'accès complet à la bibliothèque s'il a été indiqué dans le constructeur ou transmis à setFileName().
Par exemple, après avoir chargé avec succès la bibliothèque "GL" sur les plates-formes Unix, fileName() renverra "libGL.so". Si le nom de fichier était à l'origine "/usr/lib/libGL", fileName() renverra "/usr/lib/libGL.so".
Fonctions d'accès :
| QString | fileName() const |
| void | setFileName(const QString &fileName) |
loadHints : LoadHints
Donnez à la fonction load() des indications sur la manière dont elle doit se comporter.
Vous pouvez donner des indications sur la manière dont les symboles sont résolus. En général, les symboles ne sont pas résolus au moment du chargement, mais paresseusement (c'est-à-dire lorsque resolve() est appelé). Si vous attribuez la valeur ResolveAllSymbolsHint à loadHints, tous les symboles seront résolus au moment du chargement si la plate-forme le permet.
En définissant ExportExternalSymbolsHint, les symboles externes de la bibliothèque seront disponibles pour être résolus dans les bibliothèques chargées ultérieurement.
Si LoadArchiveMemberHint est défini, le nom du fichier est composé de deux éléments : Un chemin qui est une référence à un fichier d'archive suivi par le second composant qui est la référence au membre de l'archive. Par exemple, fileName libGL.a(shr_64.o) fera référence à la bibliothèque shr_64.o dans le fichier d'archive nommé libGL.a. Ceci n'est possible que sur la plateforme AIX.
L'interprétation des indices de charge dépend de la plate-forme, et si vous les utilisez, vous faites probablement des suppositions sur la plate-forme pour laquelle vous compilez, donc ne les utilisez que si vous en comprenez les conséquences.
Par défaut, aucun de ces drapeaux n'est activé, de sorte que les bibliothèques seront chargées avec une résolution de symboles paresseuse et n'exporteront pas de symboles externes pour la résolution dans d'autres bibliothèques chargées dynamiquement.
Remarque : les indices ne peuvent être supprimés que lorsque cet objet n'est pas associé à un fichier. Les indices ne peuvent être ajoutés qu'une fois que le nom du fichier est défini (hints sera or'ed avec les anciens indices).
Note : Définir cette propriété après le chargement de la bibliothèque n'a aucun effet et loadHints() ne reflétera pas ces changements.
Remarque : Cette propriété est partagée par toutes les instances de QLibrary qui font référence à la même bibliothèque.
Fonctions d'accès :
| QLibrary::LoadHints | loadHints() const |
| void | setLoadHints(QLibrary::LoadHints hints) |
Documentation des fonctions membres
[explicit] QLibrary::QLibrary(QObject *parent = nullptr)
Construit une bibliothèque avec l'adresse parent.
[explicit] QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
Construit un objet bibliothèque avec l'adresse parent qui chargera la bibliothèque spécifiée par fileName.
Nous recommandons d'omettre le suffixe du fichier dans fileName, car QLibrary recherchera automatiquement le fichier avec le suffixe approprié en fonction de la plateforme, par exemple ".so" sous Unix, ".dylib" sous macOS et iOS, et ".dll" sous Windows. (Voir fileName.)
[explicit] QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
Construit un objet bibliothèque avec l'adresse parent qui chargera la bibliothèque spécifiée par fileName et le numéro de version complet version. Actuellement, le numéro de version est ignoré sous Windows.
Nous recommandons d'omettre le suffixe du fichier dans fileName, car QLibrary recherchera automatiquement le fichier avec le suffixe approprié en fonction de la plate-forme, par exemple ".so" sous Unix, ".dylib" sous macOS et iOS, et ".dll" sous Windows. (Voir fileName.)
[explicit] QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
Construit un objet bibliothèque avec l'adresse parent qui chargera la bibliothèque spécifiée par fileName et le numéro de version majeure verNum. Actuellement, le numéro de version est ignoré sous Windows.
Nous recommandons d'omettre le suffixe du fichier dans fileName, car QLibrary recherchera automatiquement le fichier avec le suffixe approprié en fonction de la plate-forme, par exemple ".so" sous Unix, ".dylib" sous macOS et iOS, et ".dll" sous Windows. (Voir fileName.)
[virtual noexcept] QLibrary::~QLibrary()
Détruit l'objet QLibrary.
À moins que unload() n'ait été appelé explicitement, la bibliothèque reste en mémoire jusqu'à ce que l'application se termine.
Voir aussi isLoaded() et unload().
QString QLibrary::errorString() const
Renvoie une chaîne de texte contenant la description de la dernière erreur survenue. Actuellement, errorString n'est défini que si load(), unload() ou resolve() échoue pour une raison quelconque.
[static] bool QLibrary::isLibrary(const QString &fileName)
Renvoie true si fileName a un suffixe valide pour une bibliothèque chargeable ; sinon, renvoie false.
| Plate-forme | Suffixes valides |
|---|---|
| Windows | .dll, .DLL |
| Unix/Linux | .so |
| AIX | .a |
| HP-UX | .sl .so (HP-UXi) |
| macOS et iOS | .dylib .bundle, .so |
Sous Unix, les numéros de version qui suivent sont ignorés.
bool QLibrary::isLoaded() const
Renvoie true si load() a réussi ; sinon, renvoie false.
Remarque : avant la version 6.6 de Qt XML, cette fonction renvoyait true même sans appel à load() si un autre objet QLibrary sur la même bibliothèque avait provoqué son chargement.
Voir aussi load().
bool QLibrary::load()
Charge la bibliothèque et renvoie true si la bibliothèque a été chargée avec succès ; sinon, renvoie false. Étant donné que resolve() appelle toujours cette fonction avant de résoudre les symboles, il n'est pas nécessaire de l'appeler explicitement. Dans certaines situations, il est possible que vous souhaitiez que la bibliothèque soit chargée à l'avance, auquel cas vous utiliserez cette fonction.
Voir aussi unload().
QFunctionPointer QLibrary::resolve(const char *symbol)
Renvoie l'adresse du symbole exporté symbol. La bibliothèque est chargée si nécessaire. La fonction renvoie nullptr si le symbole n'a pas pu être résolu ou si la bibliothèque n'a pas pu être chargée.
Exemple :
typedef int (*AvgFunction)(int, int); AvgFunction avg = (AvgFunction) library->resolve("avg"); if (avg) return avg(5, 8); else return -1;
Le symbole doit être exporté en tant que fonction C de la bibliothèque. Cela signifie que la fonction doit être enveloppée dans un extern "C" si la bibliothèque est compilée avec un compilateur C++. Sous Windows, vous devez également exporter explicitement la fonction de la DLL à l'aide de la directive du compilateur __declspec(dllexport), par exemple :
extern "C" MY_EXPORT int avg(int a, int b) { return (a + b) / 2; }
avec MY_EXPORT défini comme
#ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)
Charge la bibliothèque fileName et renvoie l'adresse du symbole exporté symbol. Notez que fileName ne doit pas inclure le suffixe de fichier spécifique à la plate-forme ; (voir fileName). La bibliothèque reste chargée jusqu'à ce que l'application se termine.
La fonction renvoie nullptr si le symbole n'a pas pu être résolu ou si la bibliothèque n'a pas pu être chargée.
Il s'agit d'une fonction surchargée.
Voir également resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
Charge la bibliothèque fileName avec le numéro de version complète version et renvoie l'adresse du symbole exporté symbol. Notez que fileName ne doit pas inclure le suffixe de fichier spécifique à la plate-forme ; (voir fileName). La bibliothèque reste chargée jusqu'à ce que l'application se termine. version est ignoré sous Windows.
La fonction renvoie nullptr si le symbole n'a pas pu être résolu ou si la bibliothèque n'a pas pu être chargée.
Il s'agit d'une fonction surchargée.
Voir également resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
Charge la bibliothèque fileName avec le numéro de version majeure verNum et renvoie l'adresse du symbole exporté symbol. Notez que fileName ne doit pas inclure le suffixe de fichier spécifique à la plate-forme ; (voir fileName). La bibliothèque reste chargée jusqu'à ce que l'application se termine. verNum est ignoré sous Windows.
La fonction renvoie nullptr si le symbole n'a pas pu être résolu ou si la bibliothèque n'a pas pu être chargée.
Il s'agit d'une fonction surchargée.
Voir également resolve().
void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &version)
Définit la propriété fileName et le numéro de la version complète à fileName et version respectivement. Le paramètre version est ignoré sous Windows.
Voir aussi setFileName().
void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)
Définit la propriété fileName et le numéro de version majeure à fileName et versionNumber respectivement. La propriété versionNumber est ignorée sous Windows.
Voir aussi setFileName().
bool QLibrary::unload()
Décharge la bibliothèque et renvoie true si la bibliothèque a pu être déchargée ; sinon, elle renvoie false.
Cela se produit automatiquement à la fin de l'application, de sorte que vous ne devriez normalement pas avoir besoin d'appeler cette fonction.
Si d'autres instances de QLibrary utilisent la même bibliothèque, l'appel échouera et le déchargement n'aura lieu que lorsque toutes les instances auront appelé unload().
Notez que sur macOS, les bibliothèques dynamiques ne peuvent pas être déchargées. QLibrary::unload() renverra true, mais la bibliothèque restera chargée dans le processus.
© 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.