其他分享
首页 > 其他分享> > QT的QLibrary类的使用

QT的QLibrary类的使用

作者:互联网

详细说明
QLibrary类在运行时加载共享库。

QLibrary对象的实例在单个共享对象文件(我们称为“库”,但也称为“ DLL”)上进行操作。 QLibrary以平台无关的方式提供对库中功能的访问。您可以在构造函数中传递文件名,也可以使用setFileName()对其进行显式设置。加载库时,除非文件名具有绝对路径,否则QLibrary会搜索所有系统特定的库位置(例如Unix上的LD_LIBRARY_PATH)。
如果文件名是绝对路径,则尝试首先加载该路径。如果找不到该文件,则QLibrary尝试使用具有特定于平台的文件前缀的名称,例如Unix和Mac上的“ lib”,以及后缀,例如Unix上的“ .so”,Mac上的“ .dylib”或“。 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 ++编译器编译该库,则该函数必须包装在extern“ C”块中。在Windows上,这还需要使用dllexport宏。有关如何完成此操作的详细信息,请参见resolve()。为了方便起见,有一个静态resolve()函数,如果您只想在库中调用一个函数而不先显式加载该库,则可以使用该函数:

 typedef void (*MyPrototype)();
  MyPrototype myFunction =
          (MyPrototype) QLibrary::resolve("mylib", "mysymbol");
  if (myFunction)
      myFunction();

标签:myFunction,resolve,QT,函数,MyPrototype,使用,QLibrary,加载
来源: https://blog.csdn.net/it_xiangqiang/article/details/111151181