QLibrary
QLibrary
#include <QLibrary>
Public Types
enum | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
flags | LoadHints |
Properties
- 1 property inherited from QObject
Public Functions
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 public functions inherited from QObject
Static Public Members
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类在运行时加载共享库。
QLibrary对象的实例在单个共享对象文件(我们称之为“库”,但也称为“DLL”)上操作。QLibrary以独立于平台的方式提供对库中功能的访问。您可以在构造函数中传递文件名,也可以使用setFileName()显式设置它。加载库时,QLibrary会搜索所有特定于系统的库位置(例如Unix上的LD_library_PATH),除非文件名具有绝对路径。
如果文件名是绝对路径,则会尝试首先加载此路径。如果找不到文件,QLibrary会尝试使用不同平台特定的文件前缀(如Unix和Mac上的“lib”)和后缀(如Unix上的“.so”、Mac上的”.dylib“或Windows上的”.dll“)命名。
如果文件路径不是绝对的,那么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()才能工作。这意味着,如果使用C++编译器编译库,则函数必须封装在外部“C”块中。在Windows上,这还需要使用dllexport宏;有关如何执行此操作的详细信息,请参见resolve()。为了方便起见,如果您只想在不首先显式加载库的情况下调用库中的函数,则可以使用静态resolve()函数:
typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) QLibrary::resolve("mylib", "mysymbol"); if (myFunction) myFunction();
##################################