Класс QLibrary
Класс QLibrary загружает динамические библиотеки во время выполнения. Подробнее...
| Заголовок: | #include <QLibrary> |
| qmake: | QT += core |
| Наследует: | QObject |
Примечание: Все функции в этом классе являются перевключенными.
Типы public
| Перечисление | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
| Флаги | LoadHints |
Свойства
Функции public
| QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, QObject *parent = nullptr) | |
| QLibrary(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, int versionNumber) |
| void | setFileNameAndVersion(const QString &fileName, const QString &version) |
| void | setLoadHints(QLibrary::LoadHints hints) |
| bool | unload() |
Статические public члены
| bool | isLibrary(const QString &fileName) |
| QFunctionPointer | resolve(const QString &fileName, const char *symbol) |
| QFunctionPointer | resolve(const QString &fileName, int verNum, const char *symbol) |
| QFunctionPointer | resolve(const QString &fileName, const QString &version, const char *symbol) |
Подробное описание
Экземпляр объекта QLibrary работает с одним файлом динамической библиотеки (которую мы называем «библиотекой», но она также известна как «DLL»). QLibrary предоставляет доступ к функциональности библиотеки независимо от платформы. Вы можете передать имя файла в конструкторе или установить его явно с помощью setFileName(). При загрузке библиотеки QLibrary ищет ее во всех системных расположениях библиотек (например, LD_LIBRARY_PATH в Unix), если имя файла не является абсолютным.
Если имя файла является абсолютным путем, то сначала делается попытка загрузить этот путь. Если файл не найден, QLibrary пробует имя с различными платформа-специфическими префиксами и суффиксами, такими как «lib» в Unix и Mac и «.so» в Unix, «.dylib» на Mac или «.dll» в Windows.
Если путь к файлу не является абсолютным, то QLibrary изменяет порядок поиска, чтобы сначала попробовать системные префиксы и суффиксы, а затем указанный путь к файлу.
Это позволяет указать динамические библиотеки, которые идентифицируются только своим базовым именем (т. е. без суффикса), поэтому один и тот же код будет работать на разных операционных системах, но при этом минимизирует количество попыток найти библиотеку.
Наиболее важные функции — load() для динамической загрузки файла библиотеки, isLoaded() для проверки успешности загрузки и resolve() для разрешения символа в библиотеке. Функция resolve() неявно пытается загрузить библиотеку, если она еще не загружена. Несколько экземпляров QLibrary могут использоваться для доступа к одной и той же физической библиотеке. После загрузки библиотеки она остается в памяти до завершения приложения. Вы можете попытаться разгрузить библиотеку с помощью unload(), но если другие экземпляры QLibrary используют ту же библиотеку, вызов не удастся, и разгрузка произойдет только тогда, когда каждый экземпляр вызовет unload().
Типичное использование QLibrary заключается в разрешении экспортированного символа в библиотеке и вызове C-функции, которую представляет этот символ. Это называется «явной связью» в отличие от «неявной связи», которая выполняется этапом линковки при построении исполняемого файла, когда он связан с библиотекой.
Следующий фрагмент кода загружает библиотеку, разрешает символ «mysymbol» и вызывает функцию, если все прошло успешно. Если что-то пойдет не так, например, файл библиотеки не существует или символ не определен, указатель на функцию будет nullptr и не будет вызван.
QLibrary myLib("mylib");
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
myFunction(); Символ должен быть экспортирован как C-функция из библиотеки для работы resolve(). Это означает, что функция должна быть обернута в extern "C" блок, если библиотека скомпилирована с помощью компилятора C++. В Windows для этого также требуется использование макроса dllexport; см. resolve() для получения подробностей о том, как это делается. Для удобства существует статическая функция resolve(), которую вы можете использовать, если хотите просто вызвать функцию в библиотеке без явного предварительного загрузки библиотеки:
typedef void (*MyPrototype)();
MyPrototype myFunction =
(MyPrototype) QLibrary::resolve("mylib", "mysymbol");
if (myFunction)
myFunction(); См. также QPluginLoader.
Документация по типам членов
enum QLibrary::LoadHintflags QLibrary::LoadHints
Это перечисление описывает возможные подсказки, которые могут использоваться для изменения способа обработки библиотек при их загрузке. Эти значения указывают, как разрешаются символы при загрузке библиотек, и задаются с помощью функции setLoadHints().
| Постоянная | Значение | Описание |
|---|---|---|
QLibrary::ResolveAllSymbolsHint |
0x01 |
Принуждает к разрешению всех символов в библиотеке при ее загрузке, а не только при вызове resolve(). |
QLibrary::ExportExternalSymbolsHint |
0x02 |
Экспортирует неразрешенные и внешние символы в библиотеке, чтобы их можно было разрешить в других динамически загруженных библиотеках, загруженных позже. |
QLibrary::LoadArchiveMemberHint |
0x04 |
Разрешает указание имени файла библиотеки для указания конкретного файла объекта в архиве. Если эта подсказка задана, имя файла библиотеки состоит из пути, который является ссылкой на архивный файл, за которым следует ссылка на член архива. |
QLibrary::PreventUnloadHint |
0x08 |
Запрещает разгрузку библиотеки из адресного пространства, если вызывается close(). Статические переменные библиотеки не переинициализируются, если open() вызывается в более позднее время. |
QLibrary::DeepBindHint |
0x10 |
Указывает компоновщику отдавать предпочтение определениям в загруженной библиотеке перед экспортированными определениями в загружающем приложении при разрешении внешних символов в загруженной библиотеке. Этот параметр поддерживается только в Linux. |
Тип LoadHints является типом-псевдонимом для QFlags<LoadHint>. Он хранит логическое ИЛИ сочетание значений LoadHint.
См. также loadHints.
Документация свойств
fileName : QString
Это свойство содержит имя файла библиотеки.
Рекомендуется опускать расширение файла в имени файла, так как QLibrary автоматически будет искать файл с соответствующим расширением (см. isLibrary()).
При загрузке библиотеки QLibrary ищет её во всех системных расположениях библиотек (например, LD_LIBRARY_PATH в Unix), если имя файла не имеет абсолютного пути. После успешной загрузки библиотеки fileName() возвращает полное имя файла библиотеки, включая полный путь к библиотеке, если он был задан в конструкторе или передан в setFileName().
Например, после успешной загрузки библиотеки «GL» на платформах Unix, fileName() вернёт «libGL.so». Если имя файла изначально было задано как «/usr/lib/libGL», fileName() вернёт «/usr/lib/libGL.so».
Функции доступа:
| QString | fileName() const |
| void | setFileName(const QString &fileName) |
loadHints : LoadHints
Предоставляет функции load() подсказки о её поведении.
Вы можете предоставить подсказки о том, как должны разрешаться символы. Обычно символы разрешаются не во время загрузки, а лениво (то есть, когда вызывается resolve()). Если вы установите loadHints в ResolveAllSymbolsHint, все символы будут разрешены во время загрузки, если платформа это поддерживает.
Установка ExportExternalSymbolsHint сделает внешние символы в библиотеке доступными для разрешения в последующих загруженных библиотеках.
Если установлен LoadArchiveMemberHint, имя файла состоит из двух компонентов: пути, являющегося ссылкой на архивный файл, и второго компонента, являющегося ссылкой на элемент архива. Например, fileName libGL.a(shr_64.o) будет ссылаться на библиотеку shr_64.o в архивном файле libGL.a. Эта функция поддерживается только на платформе AIX.
Интерпретация подсказок загрузки зависит от платформы, и если вы её используете, вы, вероятно, делаете предположения о целевой платформе компиляции, поэтому используйте их только в том случае, если вы понимаете последствия.
По умолчанию ни один из этих флагов не установлен, поэтому библиотеки будут загружаться с ленивым разрешением символов и не будут экспортировать внешние символы для разрешения в других динамически загруженных библиотеках.
Примечание: Установка этого свойства после загрузки библиотеки не имеет эффекта, и loadHints() не будет отражать эти изменения.
Примечание: Это свойство совместно используется всеми экземплярами QLibrary, которые ссылаются на одну и ту же библиотеку.
Функции доступа:
| QLibrary::LoadHints | loadHints() const |
| void | setLoadHints(QLibrary::LoadHints hints) |
Документация по членам-функциям
QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
Создаёт объект библиотеки с заданным parent, который загрузит библиотеку, указанную fileName и полным номером версии version. В настоящее время номер версии игнорируется в Windows.
Рекомендуется опускать расширение файла в fileName, так как QLibrary автоматически будет искать файл с соответствующим расширением в соответствии с платформой, например, «.so» в Unix, «.dylib» в macOS и iOS и «.dll» в Windows. (См. fileName.)
QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
Создаёт объект библиотеки с заданным parent, который загрузит библиотеку, указанную fileName и номером основной версии verNum. В настоящее время номер версии игнорируется в Windows.
Рекомендуется опускать расширение файла в fileName, так как QLibrary автоматически будет искать файл с соответствующим расширением в соответствии с платформой, например, «.so» в Unix, «.dylib» в macOS и iOS и «.dll» в Windows. (См. fileName.)
QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
Создаёт объект библиотеки с заданным parent, который загрузит библиотеку, указанную fileName.
Рекомендуется опускать расширение файла в fileName, так как QLibrary автоматически будет искать файл с соответствующим расширением в соответствии с платформой, например, «.so» в Unix, «.dylib» в macOS и iOS и «.dll» в Windows. (См. fileName.)
QLibrary::QLibrary(QObject *parent = nullptr)
Создаёт библиотеку с заданным parent.
[virtual] QLibrary::~QLibrary()
Удаляет объект QLibrary.
Если явно не был вызван unload(), библиотека остаётся в памяти до завершения приложения.
См. также isLoaded() и unload().
QString QLibrary::errorString() const
Возвращает строку текста с описанием последней произошедшей ошибки. В настоящее время errorString будет установлено только в случае, если load(), unload() или resolve() по какой-либо причине завершатся неудачно.
Эта функция была добавлена в Qt 4.2.
[static] bool QLibrary::isLibrary(const QString &fileName)
Возвращает true , если fileName имеет допустимое расширение для загружаемой библиотеки; в противном случае возвращает false.
| Платформа | Допустимые расширения |
|---|---|
| Windows |
.dll, .DLL
|
| Unix/Linux | .so |
| AIX | .a |
| HP-UX |
.sl, .so (HP-UXi) |
| macOS и iOS |
.dylib, .bundle, .so
|
Конечные номера версий в Unix игнорируются.
bool QLibrary::isLoaded() const
Возвращает true , если библиотека загружена; в противном случае возвращает false.
См. также load().
bool QLibrary::load()
Загружает библиотеку и возвращает true , если библиотека загружена успешно; в противном случае возвращает false. Так как resolve() всегда вызывает эту функцию перед разрешением каких-либо символов, её явное вызов не обязательно. В некоторых ситуациях вам может потребоваться предварительно загрузить библиотеку, в этом случае используйте эту функцию.
См. также unload().
QFunctionPointer QLibrary::resolve(const char *symbol)
Возвращает адрес экспортированного символа symbol. Библиотека загружается при необходимости. Функция возвращает nullptr , если символ не удалось разрешить или если библиотеку не удалось загрузить.
Пример:
typedef int (*AvgFunction)(int, int);
AvgFunction avg = (AvgFunction) library->resolve("avg");
if (avg)
return avg(5, 8);
else
return -1; Символ должен быть экспортирован как функция C из библиотеки. Это означает, что функция должна быть обернута в extern "C" , если библиотека скомпилирована с помощью компилятора C++. В Windows вы также должны явно экспортировать функцию из DLL с помощью директивы компилятора __declspec(dllexport), например:
extern "C" MY_EXPORT int avg(int a, int b)
{
return (a + b) / 2;
} где MY_EXPORT определено как
#ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)
Это перегруженная функция.
Загружает библиотеку fileName и возвращает адрес экспортированного символа symbol. Обратите внимание, что fileName не должна содержать платформенно-специфического расширения файла; (см. fileName). Библиотека остается загруженной до выхода приложения.
Функция возвращает nullptr , если символ не удалось разрешить или если библиотеку не удалось загрузить.
См. также resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
Это перегруженная функция.
Загружает библиотеку fileName с номером основной версии verNum и возвращает адрес экспортированного символа symbol. Обратите внимание, что fileName не должно содержать платформозависимого расширения файла; (см. fileName). Библиотека остается загруженной до выхода приложения. verNum игнорируется в Windows.
Функция возвращает nullptr если символ не удалось разрешить или библиотеку не удалось загрузить.
См. также resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
Это перегруженная функция.
Загружает библиотеку fileName с полным номером версии version и возвращает адрес экспортированного символа symbol. Обратите внимание, что fileName не должно содержать платформозависимого расширения файла; (см. fileName). Библиотека остается загруженной до выхода приложения. Параметр version игнорируется в Windows.
Функция возвращает nullptr если символ не удалось разрешить или библиотеку не удалось загрузить.
Эта функция была добавлена в Qt 4.4.
См. также resolve().
void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)
Устанавливает свойство fileName и номер основной версии соответственно на fileName и versionNumber. Параметр versionNumber игнорируется в Windows.
См. также setFileName().
void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &version)
Устанавливает свойство fileName и полный номер версии соответственно на fileName и version. Параметр version игнорируется в Windows.
Эта функция была добавлена в Qt 4.4.
См. также setFileName().
bool QLibrary::unload()
Выгружает библиотеку и возвращает true если библиотека была выгружена; в противном случае возвращает false.
Это происходит автоматически при завершении приложения, поэтому обычно вам не нужно вызывать эту функцию.
Если другие экземпляры QLibrary используют ту же библиотеку, вызов завершится неудачей, и выгрузка произойдет только тогда, когда каждый экземпляр вызовет unload().
Обратите внимание, что на Mac OS X 10.3 (Panther) динамические библиотеки не могут быть выгружены.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qlibrary.html