ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QT的QLibrary类的使用

2020-12-14 10:32:30  阅读:974  来源: 互联网

标签:myFunction resolve QT 函数 MyPrototype 使用 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有