QT插件和普通动态库的差别?!

葬爱の丫 2014-07-25 12:10:40
我在网上查了半天,没有结果,望熟悉QT的各位帮助。
在建立QT项目时,可以建立QT plugin,也可以建立QT liblibrary.
而插件其实就是一个动态链接库,那么这两种工程有什么区别?
我像VC中那样创建个动态链接库工程,生成dll、lib、.h,和这个插件有何区别?
为什么要使用插件呢,优势呢?我看不出和生成一个普通动态链接库的区别....而QT插件还必须遵循一些QT的硬性规定。

另:QT插件可以被C#调用么?我知道普通的C++DLL可以通过PInvoke由C#调用。QT插件貌似不能够被调用吧?
...全文
2772 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
葬爱の丫 2014-07-31
  • 打赏
  • 举报
回复
在C++版面开了帖子,有了些收获,这里就结贴啦,感谢楼上各位的帮助!
葬爱の丫 2014-07-29
  • 打赏
  • 举报
回复
感谢楼上,因为最近必须要在C#中调用别人写好的C++DLL。楼上对Pinvoke了解深么?C#只能调用C++全局函数/静态函数?我调用C++类成员函数,是失败的。难道Pinvoke不能调用C++非静态类成员函数?
dbzhang800 2014-07-27
  • 打赏
  • 举报
回复
建议你暂时先不要纠结Qt插件这个问题了,你应该还没有用过插件,所以你不知道插件的用途是什么。你可以用你最熟悉的东西,写一个插件程序,反过来再来看Qt中的插件,一切就都明了了。 如果你熟悉C#,你可以先写一个C#的插件程序,熟悉一下插件概念。 如果你熟悉python,你可以写一个python的插件程序,熟悉一下插件概念。 如果你熟悉C/C++,而且了解所用系统的动态库/共享库的显式加载,你可以写一个C/C++的插件程序,熟悉一下插件概念。 如果你熟悉... 这些东西都和Qt没有关系,但是,概念都是一样的。 --- 题外,我不太清楚,你为什么会纠结C#和Qt的混合调用,在你对C#/C++/Qt 这三者都特别熟悉之前,建议你放弃这方面的想法和尝试。从你的描述看,你对C#调用 其他语言编译的dll文件,应该也太熟。一般其他语言是不会直接调用C++的动态库的,即使在C#中,PInvoke 调用也是C的动态库,或者你的C++动态库导出了C接口。
葬爱の丫 2014-07-27
  • 打赏
  • 举报
回复
真心感谢楼上三位的讲解,在下还有两点疑问: ①:三楼所说“你只需要弄个jp2000的插件发给用户就行,其他什么都不需要。”,这里指的弄个插件发给用户,是指的发给用户某些DLL文件进行更新吧?普通动态库不也是如此么?升级时也是更新某些DLL啊...... ②:QT插件可以被C#调用么?这才是我最担心的。由于QT对此封装了,所以使用者也必须遵循QT定的某些规则,例如加载插件时使用QPluginLoader之类的,这QPluginLoader在C#里可用不了啊,我的C#如何加载QT插件啊!因为我是要在C#中用的。 我了解C#的pinvoke,将C++DLL对外接口的参数类型,在C#中声明为C#所对应的参数类型即可实现调用。 但是这QT插件如何...? 望各位再帮忙解惑一把!
dbzhang800 2014-07-25
  • 打赏
  • 举报
回复
有这些疑问,说明你没有用插件的需求而已。 另外,你这儿提到的“插件” 是指 QtCreator 插件吧?
dext 2014-07-25
  • 打赏
  • 举报
回复
我也来补充一句,Qt的插件 在Linux下 是不用export路径 的。更NB啊。
foruok 2014-07-25
  • 打赏
  • 举报
回复 1
Qt插件本身是动态库,除此之外,它定义了一组专用的接口,从动态库中导出,供 Qt 的插件管理体系发现和调用。当你选择 Qt 插件项目模板时, Qt Creator 会自动为你插入专用接口相关的模板代码。 假如你从一个白板做起,实现一个动态库,要想客户方调用,还是需要导出N多的函数。而 Qt 这种,只是它约定了你需要导出什么函数、什么类、怎样查询你导出的接口,它定义了一套规范而已。
dbzhang800 2014-07-25
  • 打赏
  • 举报
回复
引用 2 楼 u012211533 的回复:
这里提到的插件,是一种QT技术,用于创建动态链接库。和IDE无关。你用QTCreator和嵌入了QT的VS均能创建出插件......... 我疑惑的是:普通创建动态链接库的方法就能解决问题,为何QT还要封装成一种名曰“插件”的技术。
呵呵,插件 又不是 Qt 独创的东西,各种编程框架,都会引入插件这个东西。你熟悉C#的话,自然对C#中的插件应该不会陌生。 言归正传,一个 Qt 程序写好,并编译成可执行文件之后,你随时可以添加、删除、替换 一些插件,来扩充或调整程序的功能,这就是插件作用。比如,你写了一个图片处理程序(Qt默认是不支持jp2000或eps等等格式),但是用户突然需要它支持jp2000图片格式,你只需要弄个jp2000的插件发给用户就行,其他什么都不需要。
葬爱の丫 2014-07-25
  • 打赏
  • 举报
回复
这里提到的插件,是一种QT技术,用于创建动态链接库。和IDE无关。你用QTCreator和嵌入了QT的VS均能创建出插件......... 我疑惑的是:普通创建动态链接库的方法就能解决问题,为何QT还要封装成一种名曰“插件”的技术。
Qt 插件由共享库(Unix/Linux 上的 .so 以及 Windows 上的 .dll)实现。简单来说,一切关于共享库的知识,在 Qt 插件上同样适用。Qt 插 件根本上说就是符合某些规定的共享库。从另外一方面说,插件架构是不同于普通的链接的。我们可以将插件理解成一种动态链接技术, 而非插件则是静态链接。 插件系统机制是,核心系统指定接口和交换的数据格式(通常是以 API 的形式给出)。这种接口和特定的数据格式形成一种协议,不同模 块通过这种协议与核心系统进行交互,或者是能够通过核心系统将自己的某些功能暴露出来(也就是为其它模块提供服务)。仅仅将所需 要的功能放到动态链接库里面并不能满足一些特定的需求,比如,我们希望应用程序能够自动发现某一特定文件夹下的动态链接库,能够 知道这些动态链接库内部的逻辑是怎样的,我们能够如何使用它们。这些需求,对于一个普通的动态链接库模块是不能实现的(或者说, 不是自动提供的功能,而需要编写额外的代码)。于是,我们需要一个插件架构。一般来说,动态链接库能够对外暴露出的是一系列函 数。对于链接库内部的变量、类以及对象则不能直接访问。编写插件则可以绕过这个限制,插件内部的变量、对象都可以直接对应用程序 暴露出来。

16,819

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧