Класс 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 и macOS) и суффиксов (например, «.so» в Unix, «.dylib» в macOS или «.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.
Документация по типам членов
Перечисление QLibrary::LoadHintфлаги QLibrary::LoadHints
Это перечисление описывает возможные подсказки, которые можно использовать для изменения способа обработки библиотек при их загрузке. Эти значения указывают на то, как разрешаются символы при загрузке библиотек и задаются с помощью функции setLoadHints().
| Константа | Значение | Описание |
|---|---|---|
QLibrary::ResolveAllSymbolsHint |
0x01 |
Приводит к разрешению всех символов в библиотеке при её загрузке, а не только при вызове resolve(). |
QLibrary::ExportExternalSymbolsHint |
0x02 |
Экспортирует неразрешённые и внешние символы в библиотеке, чтобы их можно было разрешить в других динамически загружаемых библиотеках, загружаемых позже. |
QLibrary::LoadArchiveMemberHint |
0x04 |
Разрешает указанию имени файла библиотеки для указания конкретного файла объекта внутри файла архива. Если эта подсказка задана, имя файла библиотеки состоит из пути, который является ссылкой на файл архива, за которым следует ссылка на член архива. |
QLibrary::PreventUnloadHint |
0x08 |
Запрещает разгрузку библиотеки из адресного пространства, если вызван close(). Статические переменные библиотеки не перезапускаются, если open() вызывается в более позднее время. |
QLibrary::DeepBindHint |
0x10 |
Инструктирует компоновщик предпочесть определения в загруженной библиотеке перед экспортированными определениями в загружающем приложении при разрешении внешних символов в загруженной библиотеке. Этот параметр поддерживается только в Linux. |
Тип LoadHints — это typedef для 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.15/qlibrary.html