各位前辈好,目前想做一个具有插件功能的软件(类似 vim 那样的插件功能),是否有什么框架或者库可以使用?
如果没有现成的库可以用,我的想法是通过动态链接文件来实现:即软件主体读取配置文件,获取配置文件中的插件信息,然后在某个目录下搜寻对应的动态链接文件,利用动态链接文件加载函数加载动态链接文件,然后调用动态链接文件中的接口来启动插件。不知道这个想法是否可行?
1
ysc3839 2020-02-23 21:27:08 +08:00
不想麻烦的话可以考虑用 pybind11 直接嵌入 Python,用 Python 写插件。
https://github.com/pybind/pybind11 |
2
KDr2 2020-02-23 21:30:37 +08:00
|
3
maty 2020-02-23 21:47:11 +08:00
嵌入 lua,对 lua 开发的接口可以使用 swig
|
4
zhuangzhuang1988 2020-02-23 22:29:48 +08:00
可行, 而且很多软件就是这么做的.
|
5
xdeng 2020-02-23 23:10:50 +08:00
|
6
augustheart 2020-02-23 23:21:21 +08:00
你这个直接用导出函数开撸就行了,不用考虑库。
因为做库的人不能想到你的插件和软件主体用什么方法沟通,库也没什么用。 |
7
itfanr 2020-02-24 08:56:32 +08:00
@xdeng 我和你一样推荐。 https://github.com/visualfc/liteide 这个的插件机制挺好的 可以参考
|
8
nightwitch 2020-02-24 14:04:14 +08:00 1
二进制的插件是邪道,容易碰见 ABI 问题。既然你用过 vim,你应该知道 youcompleteme 在不同平台下有多麻烦。
建议内嵌 Python/lua/javascript 做插件系统,前两个都应该很成熟了,javascript 不熟,不发表意见。 |
10
root1iu OP @KDr2 谢谢您,但 Qt 应该不太适合,因为这个软件目前的是要做在服务端的,感觉 Qt 比较适合做客户端图形界面,不知道我的理解是否有误
|
12
edimetia3d 2020-02-24 19:14:41 +08:00
对性能不敏感的话,我也支持用 python 这样的胶水语言来做插件,ABI 相关的问题都不用自己来解决
|
13
root1iu OP @zhuangzhuang1988 这么巧吗,但不知道是否会出现 @nightwitch 提到的 ABI 问题,目前还没有试过
|
14
root1iu OP @augustheart 导出函数应该是指动态链接文件提供的接口吧?不知道这种方法兼容性会不会差一些
|
16
root1iu OP @nightwitch YCM 确实很麻烦,我也有点害怕 ABI 兼容问题,目前似乎有 Python 的解决方案,我先试试,不理想就试一下动态链接库的这种吧
|
17
root1iu OP 嗯,我先试试 Python 的解决方案,不满意再换,感觉解决 ABI 问题需要很深的积累 0.0
|
18
zhuangzhuang1988 2020-02-24 20:08:03 +08:00
@root1iu abi 问题也很好解决
学下微软的 COM 解决方案就行了, 有些商业软件在 Linux 上也这么玩的 |
19
augustheart 2020-02-24 20:12:27 +08:00
@root1iu binary 的话肯定是需要考虑平台问题的,话说你的主题也没考虑跨平台啊。但你既然考虑 c++,我就默认你 c++一把梭了。
|
20
augustheart 2020-02-24 20:13:57 +08:00
@root1iu 类似的东西、各种视频播放器、音频播放器已经有了几十年的使用经验。只是不跨平台。
|
21
root1iu OP @zhuangzhuang1988 明白了,谢谢前辈
|
22
root1iu OP @augustheart 嗯,想先试试用 Python 来做,看看效果,谢谢啦
|
23
FrankHB 2020-02-25 14:42:54 +08:00
@zhuangzhuang1988 一句“很好解决”“学下”,是不是要人顺手就糊一个 IDL ?
|
24
zhuangzhuang1988 2020-02-25 15:15:51 +08:00
@FrankHB 那还是嵌脚本算了.
|
25
FrankHB 2020-02-27 13:47:54 +08:00
@zhuangzhuang1988 讲道理,这才是正常思路嘛。
技术上讲,要比较彻底地(让最终用户不被坑地)解决这个问题,提供 IDL 都不够用。不说这里实现的 bug 可能比编译器出问题更没法收场,就是都正确实现了,插件不守规矩出的问题很可能就无解,加上容忍不可信来源就更加没法收场了。 敢这样做方案的,要么极端地限制二进制接口(到插件不太有意义的程度),否则起码得自己发行包管理器和对应的版本库保证二进制版本可追溯。对开发用途来讲,还得集成 CI + devel pkg。 说到底这就是操作系统发行版的干活。以二进制插件兼容为荣的浏览器都普遍放弃了这个做法。 (……而想以开发者也不被坑地彻底解决这个问题,起码是要自己实现链接器限制某些特性滥用的。) |