与主执行模块和动态库的 2 路通信

Posted

技术标签:

【中文标题】与主执行模块和动态库的 2 路通信【英文标题】:2 way communication with main exec module and dynamic lib 【发布时间】:2011-08-27 20:52:35 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您在运行时链接的库对于您的程序流来说真的不应该太重要;相反,如果您愿意,它们应该位于“叶端”。尤其是通用库通常只展示完成一项特定任务的功能(例如加密某些东西)。

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

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

最后,由于dlopen 风格的接口只处理C 风格的函数指针,所以您基本上只能使用C 风格的接口。如果您愿意,您可以通过函数指针,但请参阅上面的考虑是否会导致良好的设计。拥有 C++ 接口(例如,导出通过引用获取类的函数)要棘手得多,因为您必须确保库(以及所有未来第三方提供的库的化身)符合相同的 ABI 和 C++ ABI比 C ABI 复杂得多,并且可能会发生变化。

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

【讨论】:

以上是关于与主执行模块和动态库的 2 路通信的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记--动态库和静态库的使用

VS2019 C++动态链接库的创建使用

静态库与动态库的简单说明

动态链接库和静态链接库的区别

如何使用cmake生成基于静态库的动态链接库

Linux编程中链接库的使用