Spec-Zone.ru › Qt 5.6

Класс QLibrary

Класс QLibrary загружает динамические библиотеки во время выполнения. Подробнее...

Заголовок: #include <QLibrary>
qmake: QT += core
Наследуется от: QObject
  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются реентерабельными.

Типы

Перечисление LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint }
Флаги LoadHints

Свойства

  • fileName : QString
  • loadHints : LoadHints
  • 1 свойство унаследовано от QObject

Открытые функции

QLibrary(QObject *parent = Q_NULLPTR)
QLibrary(const QString &fileName, QObject *parent = Q_NULLPTR)
QLibrary(const QString &fileName, int verNum, QObject *parent = Q_NULLPTR)
QLibrary(const QString &fileName, const QString &version, QObject *parent = Q_NULLPTR)
~QLibrary()
QString errorString() const
QString fileName() const
bool isLoaded() const
bool load()
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(LoadHints hints)
bool unload()
  • 31 открытая функция унаследована от 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.

Установка PreventUnloadHint будет применяться только на платформах Unix.

Интерпретация подсказок загрузки зависит от платформы, и если вы их используете, вы, вероятно, делаете предположения о платформе, для которой компилируете, поэтому используйте их только если понимаете последствия их применения.

По умолчанию ни один из этих флагов не установлен, поэтому библиотеки будут загружаться с ленивым разрешением символов и не будут экспортировать внешние символы для разрешения в других динамически загружаемых библиотеках.

Примечание: Установка этого свойства после загрузки библиотеки не повлияет на него, и loadHints() не будет отражать эти изменения.

Примечание: Это свойство совместно используется всеми экземплярами QLibrary, которые ссылаются на одну и ту же библиотеку.

Функции доступа:

LoadHints loadHints() const
void setLoadHints(LoadHints hints)

Документация по членам функции

QLibrary::QLibrary(QObject *parent = Q_NULLPTR)

Конструирует библиотеку с заданным parent.

QLibrary::QLibrary(const QString &fileName, QObject *parent = Q_NULLPTR)

Конструирует объект библиотеки с заданным parent, который будет загружать библиотеку, указанную параметром fileName.

Рекомендуется опускать суффикс файла в fileName, так как QLibrary автоматически будет искать файл с соответствующим суффиксом в соответствии с платформой, например, ".so" в Unix, ".dylib" в macOS и iOS, и ".dll" в Windows. (См. fileName.)

QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = Q_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 = Q_NULLPTR)

Конструирует объект библиотеки с заданным parent, который будет загружать библиотеку, указанную параметром fileName, и полным номером версии version. В настоящее время номер версии игнорируется в Windows.

Рекомендуется опускать суффикс файла в fileName, так как QLibrary автоматически будет искать файл с соответствующим суффиксом в соответствии с платформой, например, ".so" в Unix, ".dylib" в macOS и iOS, и ".dll" в Windows. (См. fileName.)

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) динамические библиотеки разгрузить нельзя.

См. также resolve() и load().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qlibrary.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API