Класс QLibrary
Класс QLibrary загружает динамические библиотеки во время выполнения. Подробнее...
| Заголовок: | #include <QLibrary> |
| qmake: | QT += core |
| Наследует: | QObject |
Примечание: Все функции этого класса являются реентерабельными.
Типы
| Перечисление | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
| Флаги | LoadHints |
Свойства
- 1 свойство унаследовано от QObject
Открытые функции
| QLibrary(QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr) | |
| QLibrary(const QString &fileName, const QString &version, 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() |
- 32 открытых функций унаследованы от QObject
Статические открытые члены
| 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) |
- 11 статических открытых членов унаследованы от QObject
Дополнительные унаследованные члены
- 1 открытый слот унаследован от QObject
- 2 сигналов унаследовано от QObject
- 9 защищенных функций унаследованы от QObject
Подробное описание
Класс QLibrary загружает динамические библиотеки во время выполнения.
Объект 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» и вызывает функцию, если всё прошло успешно. Если что-то пойдёт не так, например, файла библиотеки не существует или символ не определён, указатель на функцию будет равен 0 и не будет вызван.
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(QObject *parent = nullptr)
Создаёт библиотеку с указанным parent.
QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
Создаёт объект библиотеки с указанным parent, который загрузит библиотеку, указанную fileName.
Рекомендуется опускать расширение файла в 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, const QString &version, QObject *parent = nullptr)
Создаёт объект библиотеки с указанным parent, который загрузит библиотеку, указанную fileName и полным номером версии version. В настоящее время номер версии игнорируется в Windows.
Рекомендуется опускать расширение файла в fileName, так как QLibrary автоматически будет искать файл с соответствующим расширением в соответствии с платформой, например ".so" в Unix, ".dylib" в macOS и iOS, и ".dll" в Windows. (См. fileName.)
[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. Библиотека загружается при необходимости. Функция возвращает 0, если символ не удалось разрешить или библиотеку не удалось загрузить.
Пример:
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). Библиотека остается загруженной до завершения работы приложения.
Функция возвращает 0, если символ не удалось разрешить или библиотеку не удалось загрузить.
См. также resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
Это перегруженная функция.
Загружает библиотеку fileName с номером основной версии verNum и возвращает адрес экспортированного символа symbol. Обратите внимание, что fileName не должна содержать платформозависимого расширения файла; (см. fileName). Библиотека остается загруженной до завершения работы приложения. verNum игнорируется в Windows.
Функция возвращает 0, если символ не удалось разрешить или библиотеку не удалось загрузить.
См. также resolve().
[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
Это перегруженная функция.
Загружает библиотеку fileName с полным номером версии version и возвращает адрес экспортированного символа symbol. Обратите внимание, что fileName не должна содержать платформозависимого расширения файла; (см. fileName). Библиотека остается загруженной до завершения работы приложения. version игнорируется в Windows.
Функция была добавлена в 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/archives/qt-5.11/qlibrary.html