QLibrary Class
La classe QLibrary charge les bibliothèques partagées lors de l'exécution. En savoir plus...
| En-tête : | #include <QLibrary> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Hérite de : | QObject |
- Liste de tous les membres, y compris les membres hérités
- QLibrary fait partie des classes de plugins.
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 l’on appelle « bibliothèque », mais qui est également connu sous le nom de « DLL »). Une QLibrary permet d’accéder aux fonctionnalités de la bibliothèque de manière indépendante de la plate-forme. Vous pouvez soit passer un nom de fichier dans le constructeur, soit le définir explicitement à l'aide de la fonction setFileName(). Lors du chargement de la bibliothèque, QLibrary effectue une recherche dans tous les emplacements de bibliothèques spécifiques au système (par exemple, LD_LIBRARY_PATH sous Unix), sauf si le nom de fichier comporte un chemin absolu.
Si le nom de fichier correspond à un chemin absolu, QLibrary tente d’abord de charger ce chemin. Si le fichier est introuvable, QLibrary essaie le nom avec différents préfixes de fichiers spécifiques à la plate-forme, comme « lib » sous Unix et Mac, et différents suffixes, comme « .so » sous Unix, « .dylib » sur 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 identifiées uniquement par leur nom de base (c’est-à-dire sans leur suffixe), de sorte que le même code fonctionne 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 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 celle-ci n’a pas encore été chargée. Il est possible d’utiliser plusieurs instances de QLibrary pour accéder à la même bibliothèque physique. Une fois chargées, les bibliothèques restent en mémoire jusqu’à la fermeture de l’application. Vous pouvez tenter de décharger une bibliothèque à l’aide de ` unload()` (), mais si d’autres instances de QLibrary utilisent cette même bibliothèque, l’appel échouera, et le déchargement n’aura lieu que lorsque chaque instance aura appelé ` unload()` ().
Une utilisation courante de QLibrary consiste à résoudre un symbole exporté dans une bibliothèque et à appeler la fonction C que ce symbole représente. On parle alors de « liaison explicite », par opposition à la « liaison implicite », qui est effectuée lors de l’étape de liaison dans le processus de compilation, lorsque l’on lie un exécutable à 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 bien passé. En cas d'échec, par exemple si le fichier de bibliothèque n'existe pas ou si le symbole n'est pas défini, le pointeur de fonction sera mis à 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 depuis la bibliothèque pour que ` resolve()` fonctionne. Cela signifie que la fonction doit être encapsulé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 d’une bibliothèque sans avoir à charger explicitement la bibliothèque au préalable :
typedef void (*MyPrototype)();
MyPrototype myFunction =
(MyPrototype) QLibrary::resolve("mylib", "mysymbol");
if (myFunction)
myFunction();Voir également QPluginLoader.
Documentation sur les types de membres
enum QLibrary::LoadHint
flags QLibrary::LoadHints
Cette énumération décrit les indicateurs pouvant être utilisés pour modifier la manière dont les bibliothèques sont gérées lors de leur chargement. 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 | Provoque la résolution de tous les symboles d’une bibliothèque lors de son chargement, et non pas uniquement 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 chargées dynamiquement ultérieurement. |
QLibrary::LoadArchiveMemberHint | 0x04 | Permet au nom de fichier de la bibliothèque de spécifier un fichier objet particulier au sein d’un fichier d’archive. Si cette indication est fournie, le nom de fichier de la bibliothèque se compose d’un chemin d’accès, qui est une référence à un fichier d’archive, suivi d’une référence à l’élément 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 la fonction open() est appelée ultérieurement. |
QLibrary::DeepBindHint | 0x10 | Indique à l’éditeur de liens de privilégier les définitions de la bibliothèque chargée par rapport aux définitions exportées par 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 OR de valeurs LoadHint.
Voir également loadHints.
Documentation sur les propriétés
fileName : QString
Cette propriété contient le nom du fichier de la bibliothèque
Nous vous recommandons de ne pas inclure l'extension dans le nom du fichier, car QLibrary recherchera automatiquement le fichier avec l'extension appropriée (voir isLibrary()).
Lors du chargement de la bibliothèque, QLibrary effectue une recherche dans tous les emplacements de bibliothèques spécifiques au système (par exemple, LD_LIBRARY_PATH sous Unix), sauf si le nom de fichier comporte un chemin absolu. Une fois la bibliothèque chargée, fileName() renvoie le nom de fichier complet de la bibliothèque, y compris le chemin complet vers celle-ci si celui-ci a été fourni dans le constructeur ou passé à la fonction setFileName().
Par exemple, après le chargement réussi de la bibliothèque « GL » sur des plateformes Unix, fileName() renverra « libGL.so ». Si le nom de fichier avait été initialement passé sous la forme « /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()` quelques indications sur la manière dont elle doit se comporter.
Vous pouvez fournir des indications sur la manière dont les symboles doivent être résolus. En général, les symboles ne sont pas résolus au moment du chargement, mais de manière différée (c’est-à-dire lorsque la fonction resolve() est appelée). Si vous définissez la valeur de loadHints sur ResolveAllSymbolsHint, tous les symboles seront alors résolus au moment du chargement, si la plate-forme le prend en charge.
La valeur ` ExportExternalSymbolsHint ` rendra les symboles externes de la bibliothèque disponibles pour la résolution dans les bibliothèques chargées par la suite.
Si LoadArchiveMemberHint est défini, le nom de fichier se compose de deux éléments : un chemin d’accès faisant référence à un fichier d’archive, suivi d’un deuxième élément faisant référence à l’élément contenu dans l’archive. Par exemple, fileName libGL.a(shr_64.o) fera référence à la bibliothèque shr_64.o contenue dans le fichier d’archive nommé libGL.a. Cette fonctionnalité n’est prise en charge que sur la plateforme AIX.
L’interprétation des indications de chargement dépend de la plate-forme, et si vous les utilisez, vous faites probablement certaines suppositions quant à la plate-forme pour laquelle vous compilez ; ne les utilisez donc que si vous en comprenez les conséquences.
Par défaut, aucun de ces indicateurs n’est activé ; les bibliothèques seront donc chargées avec une résolution paresseuse des symboles et n’exporteront pas de symboles externes destinés à être résolus dans d’autres bibliothèques chargées dynamiquement.
Remarque : les indications ne peuvent être effacées que lorsque cet objet n’est associé à aucun fichier. Elles ne peuvent être ajoutées qu’une fois le nom du fichier défini (la fonction `hints ` effectuera une opération « ou » avec les anciennes indications).
Remarque : la définition de cette propriété après le chargement de la bibliothèque n’a aucun effet et la fonction `loadHints()` ne tiendra pas compte de ces modifications.
Remarque : cette propriété est partagée entre toutes les instances d’ 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)
Crée une bibliothèque à partir de l'parent on fournie.
[explicit] QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
Crée un objet de bibliothèque à partir de l'parent fournie, qui chargera la bibliothèque spécifiée par fileName.
Nous recommandons d'omettre l'extension du fichier dans fileName, car QLibrary recherchera automatiquement le fichier avec l'extension appropriée 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)
Crée un objet de bibliothèque avec l'parent fournie, 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 l'extension du fichier dans fileName, car QLibrary recherchera automatiquement le fichier avec l'extension appropriée 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, int verNum, QObject *parent = nullptr)
Crée un objet de bibliothèque avec l'parent fournie, qui chargera la bibliothèque spécifiée par fileName et le numéro de version majeur verNum. Actuellement, le numéro de version est ignoré sous Windows.
Nous recommandons d’omettre l’extension du fichier dans fileName, car QLibrary recherchera automatiquement le fichier avec l’extension appropriée en fonction de la plateforme, 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 la fonction unload() n'ait été appelée explicitement, la bibliothèque reste en mémoire jusqu'à la fermeture de l'application.
Voir également isLoaded() et unload().
QString QLibrary::errorString() const
Renvoie une chaîne de texte contenant la description de la dernière erreur survenue. Actuellement, la variable `errorString` n'est définie que si les fonctions ` load()`, ` unload()` ou ` resolve()` échouent pour une raison quelconque.
[static] bool QLibrary::isLibrary(const QString &fileName)
Renvoie « true » si « fileName » comporte un suffixe valide pour une bibliothèque chargeable ; sinon, renvoie « false ».
| Plateforme | Suffixes valides |
|---|---|
| Windows | .dll, .DLL |
| Unix/Linux | .so |
| AIX | .a |
| HP-UX | .sl, .so (HP-UXi) |
| macOS et iOS | .dylib, .bundle, .so |
Les numéros de version figurant à la fin sont ignorés sous Unix.
bool QLibrary::isLoaded() const
Renvoie ` true ` si ` load()` a abouti ; sinon, renvoie ` false`.
Remarque : avant Qt 6.6, cette fonction renvoyait true même sans appel à load() si un autre objet QLibrary de la même bibliothèque avait provoqué son chargement.
Voir également load().
bool QLibrary::load()
Charge la bibliothèque et renvoie true si le chargement s'est déroulé avec succès ; sinon, renvoie false. Étant donné que resolve() appelle toujours cette fonction avant de résoudre tout symbole, il n'est pas nécessaire de l'appeler explicitement. Dans certaines situations, vous pouvez souhaiter que la bibliothèque soit chargée à l'avance ; dans ce cas, vous utiliserez cette fonction.
Voir également 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 depuis la bibliothèque. Cela signifie que la fonction doit être encapsulée dans une fonction ` extern "C" ` si la bibliothèque est compilée avec un compilateur C++. Sous Windows, vous devez également exporter explicitement la fonction depuis la DLL à l'aide de la directive de compilation ` __declspec(dllexport) `, par exemple :
extern "C" MY_EXPORT int avg(int a, int b)
{
return (a + b) / 2;
}avec ` MY_EXPORT ` défini comme suit :
#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'à la fermeture de l'application.
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 dont le numéro de version complet est version et renvoie l'adresse du symbole exporté symbol. Notez que fileName ne doit pas inclure l'extension de fichier spécifique à la plate-forme ; (voir fileName). La bibliothèque reste chargée jusqu'à la fermeture de l'application. 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 dont le numéro de version majeure est 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'à la fermeture de l'application. 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 version complet respectivement sur fileName et version. Le paramètre « version » est ignoré sous Windows.
Voir également setFileName().
void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)
Définit la propriété « fileName » et le numéro de version majeur respectivement sur fileName et versionNumber. La propriété « versionNumber » est ignorée sous Windows.
Voir également setFileName().
bool QLibrary::unload()
Décharge la bibliothèque et renvoie ` true ` si la bibliothèque a pu être déchargée ; sinon, renvoie ` false`.
Cette opération s'effectue automatiquement à la fermeture de l'application ; vous ne devriez donc 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 sous 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.