与主执行模块和动态库双向通信

2 way communication with main exec module and dynamic lib

本文关键字:动态 双向通信 模块 执行      更新时间:2023-10-16

当我想从动态链接库中调用函数时,我使用dlopen,然后使用<dlfcn.h>中的dlsym

但是什么是正确的方式,从主要的可执行模块从dll函数内调用函数?传递函数指针到dll模块并调用它们(用于进度报告目的,特殊日志记录等)的唯一正确方法是什么?

在运行时链接的库不应该是程序流的中心;相反,如果你愿意的话,它们应该在"叶子的末端"。特别是通用库通常只展示完成特定任务的函数(例如加密某些东西)。

想想看,你在运行时只能从库中导入一个函数。库不可能知道你的整个程序状态并与之进行有意义的交互。

一切都归结为设计。如果您自己设计库,并且您希望在运行时加载程序的完整部分,那么您必须提供大量的回调接口。但是,如果库是紧密耦合的,则可以考虑将其直接链接到主程序中。

最后,由于dlopen风格的接口只处理c风格的函数指针,因此基本上只能使用c风格的接口。如果您愿意,也可以传递函数指针,但请参阅上面关于这是否会导致良好设计的注意事项。拥有一个c++接口(例如导出通过引用获取类的函数)要棘手得多,因为你必须确保库(以及所有第三方提供的库的未来版本)符合相同的ABI,而c++ ABI比C ABI复杂得多,而且容易改变。

可以这样想:如果你想要一个插件架构,第三方可以在以后为你的程序编写可以使用的代码,那么使用运行时加载。如果没有意义,请在编译时使用普通链接。