美文网首页
Qt编写模块化插件式应用程序

Qt编写模块化插件式应用程序

作者: 豪爵吸金ing | 来源:发表于2017-09-30 10:45 被阅读0次

    Qt编写模块化插件式应用程序

    优点: 

    1. 责任分块,多人协同开发应用程序,每个人只需要关心自己模块内部实现即可,不需要关心其它模块业务。

    2. 为插件化销售提供技术支撑。用户可根据需要购买主框架和几个插件。

    注意点:

    1. 插件化后,怎么管理插件? 插件是否可以向下兼容,如主框架是2.0的,那么2.0之前的插件,主框架是否可以正常加载? 

    2. 插件如何管理,需要有插件管理器,用来管理插件。

    ----------------------插件式应用程序的核心-dll加载管理+明确各插件业务职责--------------------------------

    动态链接库技术用得很多。事实上,整个Windows就是由一个个动态链接库(DLL)构建起来的,不管是系统内核,或是系统调用的API封装,还是通用工具(如控制面板、ActiveX插件等),都是一个个动态链接库文件。动态链接库并不是微软独有的技术,它是软件工程发展到一定阶段的必然产物。在类Unix系统中,这种二进制可执行模块技术不叫动态链接库,而被称为共享对象或共享库,后缀名一般为.so(即Share Object的简写)。为简便,下文将统称这种动态链接的技术为DLL或共享库。

    其实,DLL文件跟普通的可执行文件差别不大,都是可执行文件嘛,装载到进程空间后,都是一些机器指令(函数代码)、内存分配(变量)等。在Windows中,这些可执行文件被称作PE/COFF格式文件,在Linux则称为ELF文件。从CPU的角度看来,程序中的各个要素,不管是函数还是变量,它们都是一个个地址,函数是入口地址,变量是访问地址;而C++的所谓类或对象,最后也被编译器肢解成了一个个变量和函数代码(这里是形象的说法,严谨技术解说请搜索C++对象模型)。DLL的装载(指导入进程空间,然后执行)方式比可执行文件的装载稍微复杂,因为它把模块链接过程推迟到了运行时。在动态链接库的装载过程中,首要任务就是解决地址重定向问题。我们知道,DLL装载到进程空间的位置(基址)是不确定的(动态装载嘛),即使DLL内部使用的函数调用和全局变量引用,在装载时都要重新计算其地址。Windows采用基址重定向(Rebasing)技术解决这一问题,而Linux采用地址无关代码(PIC,通过GOT和PLT表实现)技术。这两种技术各有优缺点。


    二、Qt中的动态链接库编程

    使用C++面向对象的类编写DLL是要注意很多细节的,主要是二进制(ABI)兼容问题。COM是一个很成功的例子,只要符合COM的规范,我们就能编写出很好的DLL来,然而COM是微软私生的,要想跨平台,我们还得另找它路。

    Qt的跨平台特性同样令人(至少是我)兽血沸腾。如果你认为QT仅仅是一个跨平台界面库,那就小看它了。我要说的是,它不但是一个通用的跨平台的面向对象的应用程序接口库(包括GUI、数据库、网络、多线程、XML、数据容器和算法等,常用的编辑资源都有封装,就是说,这些都可以跨平台,而不仅仅是界面),更是一种C++语言的扩展,一种编程平台和应用程序框架。信号和槽的机制简化了对象之间的通信,比MFC的消息映射直观多了;界面的布局管理机制使开发人员可以很轻松地编出优雅的窗体;界面语言翻译机制也很方便实用;QObject容器管理可以看到Qt在内存管理方面的努力;扩展的foreach循环结构也向现代语言靠拢……

    Qt的跨平台特性很好,对于本文的主题——动态链接库的支持也很好。QT对各种平台的动态链接库编程技术都有包装,QT把这种技术统一命名为共享库(Shared Libraries)。通过使用Qt包装过的类和宏,可以编写跨平台的共享库和插件——当然,这只是源代码级别的跨平台,你不要指望用MSVC编译出来的DLL,能集成到ARM平台的Linux程序上面——这是一个很美很美的理想哦。

    QT使用以下两个宏来实现符号(函数或全局变量/对象)的导出和导入(跨平台不能用def文件了):

    Q_DECL_EXPORT   // 必须添加到符号声明中(共享库项目)  Q_DECL_IMPORT   // 必须添加到符号声明中(使用共享库的客户项目) Q_DECL_EXPORT   // 必须添加到符号声明中(共享库项目) Q_DECL_IMPORT   // 必须添加到符号声明中(使用共享库的客户项目)

    QT使用 QLibrary 类实现共享库的动态加载,即在运行时决定加载那个DLL程序,插件机制使用。


    下节我们将通过一个例子,进入Qt插件化编程的世界。

    相关文章

      网友评论

          本文标题:Qt编写模块化插件式应用程序

          本文链接:https://www.haomeiwen.com/subject/cusgextx.html