我正在编写一个(C)程序,该程序通过dlopen()使用插件系统。我遇到的绊脚石是主程序导出一些真正需要知道调用它们的插件的函数(主要是记录保存,所以插件可以正常卸载,因为它们添加了像main这样的函数指针程序)。
我似乎找不到干净的方法来做到这一点。到目前为止我提出的选项:
- 要求插件提供其名称,或者我在加载时提供的一些数据作为函数的参数
- 我不喜欢这个选项,因为并非所有的功能都关心他们被调用的人,所以它使它变得不一致和混乱。另外,我想让插件尽可能地让人难以理解它是谁
- 使用backtrace()确定上一个函数的对象名称。
- 要求插件放置包含其名称的文件级结构(或其他变量)(让我们将其称为'plugin_info'进行讨论)。然后在加载插件时使用dlsym()来查找变量并按其名称对其进行索引(如在散列中)。然后输入#define宏,插件使用这些宏来调用函数并将宏添加
&plugin_info
作为参数。
- 这就是我现在正在使用的,但它看起来像是hackish。对于一个你必须有宏传递'& plugin_info',如果你只是传递'plugin_info'然后它从主程序而不是插件中提取'plugin_info'。通过地址引用它似乎使得它使用正确的编译,并且它不会被重新定位。这让我不喜欢这个选项,因为它似乎是未定义的行为,但它确实有效。当插件开发人员遇到函数调用问题(传递错误的参数类型或诸如此类的东西)时,宏也会让它有点混乱。
醇>
如果有任何其他想法或技巧,我很乐意知道。