V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
root1iu
V2EX  ›  C++

C++是否有什么插件功能的库?

  •  
  •   root1iu · 2020-02-23 21:13:16 +08:00 · 3196 次点击
    这是一个创建于 1521 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位前辈好,目前想做一个具有插件功能的软件(类似 vim 那样的插件功能),是否有什么框架或者库可以使用?

    如果没有现成的库可以用,我的想法是通过动态链接文件来实现:即软件主体读取配置文件,获取配置文件中的插件信息,然后在某个目录下搜寻对应的动态链接文件,利用动态链接文件加载函数加载动态链接文件,然后调用动态链接文件中的接口来启动插件。不知道这个想法是否可行?

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