Spec-Zone.ru › Qt 5.12

Класс QLibrary

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

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

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

Открытые типы

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

Свойства

  • fileName : QString
  • loadHints : 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)
const QMetaObject staticMetaObject
  • 10 статических открытых членов унаследованы от 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. Библиотека загружается при необходимости. Функция возвращает 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.

Функция была добавлена в 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/qt-5.12/qlibrary.html

Spec-Zone.ru

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