使用libdl在C中的插件架构

Luk*_*keN 6 c plugins dynamic-library

我一直在玩弄,在C中编写一个小的IRC框架,我现在要扩展一些核心功能 - 但除此之外,我希望它可以通过插件进行扩展!

到目前为止,每当我写一些与IRC相关的东西时(我写了很多东西,现在大约有6种不同的语言......我很着火!)并且实际上继续实现了一个插件架构,它是在一种解释性语言中有设施(读:滥用)所以,就像eval在Ruby中干扰整个脚本文件一样(糟糕!).

现在我想在C中滥用一些东西!

基本上我可以做三件事

  1. 在我的程序中定义一个简单的脚本语言
  2. 使用现有的,嵌入解释器
  3. 使用libdl在运行时加载*.so模块

我喜欢第三个,如果可能的话,请避开其他两个选项.也许我是某种类型的受虐狂,但我认为这对于学习目的来说既有趣又有用.

逻辑思考,明显的"痛苦链"将是(从最低到最高)2 - > 1 - > 3,原因很简单,因为libdl处理的原始代码可以(而且会)在我的脸上爆炸.

所以这个问题告诉你,stackoverflow的其他用户,你认为libdl能胜任这个任务,还是一个现实的想法?

psm*_*ars 3

libdl非常适合插件架构 - 在一定的范围内:-)。它在许多不同的软件中被大量用于此类目的。它适用于主程序和插件之间有明确定义的 API/接口,并且许多不同的插件实现相同的 API/接口的情况。例如,您的 IRC 客户端可能具有实现不同 IM 协议(Jabber、MSN、Sametime 等)的网关的插件 - 所有这些都非常相似,因此您可以定义一个具有“发送消息”等功能的 API ”、“检查回复”等 - 并编写一堆插件,每个插件都实现不同的协议。

它工作得不太好的情况是您希望插件对主程序的行为进行任意更改 - 例如,Firefox 插件可以更改浏览器选项卡的行为、它们的外观、添加/删除按钮等。这种事情在动态语言中更容易实现(这就是为什么 Firefox 的大部分都是用 javascript 实现的),如果这是您想要的自定义类型,那么您最好使用您的选项(2),并编写一个很多用户界面都是用脚本语言编写的...