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();

 

 

 

 

##################################

posted @ 2023-07-03 21:51  西北逍遥  阅读(165)  评论(0编辑  收藏  举报