关于使用QLibrary如何读取共享库
2012-09-01 04:04
260 查看
现在程序讲究个模块化,插件化,所有共享库的读取变的尤其关键,把程序写成各种各样的共享库,那升级的时候只需要重写下某个库,在保证头文件不变的情况下,更新上去,就能完美运行。Qt中读取使用共享库的类叫QLibrary. 使用起来也相当简单,最基本的使用只需要知道4个函数,load(), isLoad(), revovle()和unload().在绝大部分情况下,下面这四个函数就足够完成工作了。下面是个小例子:
这里并没有使用到load()函数,这是因为revolve()函数会自动去加载库,同时Qt还给出了一个简单的static函数来读取库中的函数:
最后要着重说明的就是,QLibrary只能读取共享库内的C函数,这是因为C++为了达到面向对象编程封装,继承,多态等特性,实际的symbol table和你定义的是不同的,他会在编译过程中加入一些字符,比如上例中的instanceOf函数,在symbol table中可能是"_ZV12instanceOf4FR"这样的存在,所以如果把该函数声明为简单的类函数,QLibrary是找不到的,必须要将你准备让QLibrary读的函数声明为C函数,如下
这个函数返回MyType的一个对象,这样,只要你有相应的头文件,就可以完全使用这个对象内的其他类函数了。
这个instanOf函数必须定义在cpp文件中,如果写在.h文件中,在生成库的时候会报多重声明的错误, 这原因我觉得有可能是因为Qt的MOC编译器通过.h文件生成一个新的moc_*.cpp,之后在GCC上编译库的时候会使用到原始的.h,.cpp和这个生成的moc.cpp,这个instanOf同时出现在原始的.h和生成的moc.cpp中就重复定义了。
// 库名是mylib.so,这个文件后缀可以不加 // Qt会根据操作系统自动添加后缀 QLibrary lib("mylib"); // 这是最重要的地方,根据你要调用的库函数先定义一个相同的函数指针 typedef (MyType *)(InstanceOf)(); // instanceOf是你要读取的库中的函数名字 InstanceOf instance = (InstanceOf)lib.revolve("instanceOf"); // revolve成功则运行函数 // 不成功则输出错误字符串 if(instance) MyType *ret = instance(); else qDebug() << lib.errorString();
这里并没有使用到load()函数,这是因为revolve()函数会自动去加载库,同时Qt还给出了一个简单的static函数来读取库中的函数:
typedef (MyType *)(InstanceOf)(); InstanceOf instance = QLibrary::revolve("mylib","instanceOf"); if(instance) MyType *ret = instance();
最后要着重说明的就是,QLibrary只能读取共享库内的C函数,这是因为C++为了达到面向对象编程封装,继承,多态等特性,实际的symbol table和你定义的是不同的,他会在编译过程中加入一些字符,比如上例中的instanceOf函数,在symbol table中可能是"_ZV12instanceOf4FR"这样的存在,所以如果把该函数声明为简单的类函数,QLibrary是找不到的,必须要将你准备让QLibrary读的函数声明为C函数,如下
extern "C" MyType *instanceOf() { return new MyType(); }
这个函数返回MyType的一个对象,这样,只要你有相应的头文件,就可以完全使用这个对象内的其他类函数了。
这个instanOf函数必须定义在cpp文件中,如果写在.h文件中,在生成库的时候会报多重声明的错误, 这原因我觉得有可能是因为Qt的MOC编译器通过.h文件生成一个新的moc_*.cpp,之后在GCC上编译库的时候会使用到原始的.h,.cpp和这个生成的moc.cpp,这个instanOf同时出现在原始的.h和生成的moc.cpp中就重复定义了。
相关文章推荐
- 关于使用QLibrary如何读取共享库
- 关于如何使用vc6.0读取xml文件中的内容
- CSDN上一篇关于如何有效的使用C#读取文件的文章 很不错的技术文章
- 关于如何使用properties读取配置文件内容问题
- 关于如何使用vc6.0读取xml文件中的内容
- 关于Ubuntu下 如何在bash使用phpstudy 套件中的php 的方法
- 关于virtualbox共享文件夹,如何添加
- 关于Handler的使用,如何使用Handler更新进度条
- 如何使用PhysicsEditor 创建多边形碰撞形状 并实行读取
- James Ward写的一篇关于如何在Flex应用中使用PDF的教程
- 关于REGEXP_SUBSTR函数 是如何使用的
- 关于draw9patch如何使用,介绍的很详细,图文并茂,收藏下,备忘!
- 关于如何使用自定义的结束消息循环的方式 (转载)
- 快速开发BACnet产品之三(关于如何使用BACnetLib_Explore测试工具)
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 如何将手机wifi网络通过USB共享给电脑使用
- QT如何从配置文件读取参数并保存最近使用的参数
- 关于vc++6.0如何使用zlib.lib的问题解决
- 关于如何解决农行网银在WIN7下使用不正常的方法
- 使用laravel开发网站时,如何实现前端导航栏共享数据二种简单的方法