关于使用QLibrary如何读取共享库

 我来答
君子素荣16168
2013-11-05 · TA获得超过139个赞
知道答主
回答量:198
采纳率:92%
帮助的人:61.3万
展开全部
现在程序讲究个模块化,插件化,所有共享库的读取变的尤其关键,把程序写成各种各样的共享库,那升级的时候只需要重写下某个库,在保证头文件不变的情况下,更新上去,就能完美运行。Qt中读取使用共享库的类叫QLibrary. 使用起来也相当简单,最基本的使用只需要知道4个函数,load(), isLoad(), revovle()和unload().在绝大部分情况下,下面这四个函数就足够完成工作了。下面是个小例子:
// 库名是mylib.so,这个文件后缀可以不加
// Qt会根据操作系统自动添加后缀
QLibrary lib(mylib);
// 这是最重要的地方,根据你要调用的库函数先定义一个相同的函数指针
typedef (MyType *)(InstanceOf)();
// instanceOf是你要读取的库中的函数名字
InstanceOf instance = (InstanceOf)lib.revolve(instanceOf);
// revolve成功则运行函数
// 不成功则输出错误字符串
if(instance)
MyType *ret = instance();elseqDebug() << 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的一个对象,这样,只要你有相应的头文件,就可以完全使用这个对象内的其他类函数了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式