与主执行模块和动态库双向通信
2 way communication with main exec module and dynamic lib
当我想从动态链接库中调用函数时,我使用dlopen
,然后使用<dlfcn.h>
中的dlsym
。
但是什么是正确的方式,从主要的可执行模块从dll函数内调用函数?传递函数指针到dll模块并调用它们(用于进度报告目的,特殊日志记录等)的唯一正确方法是什么?
在运行时链接的库不应该是程序流的中心;相反,如果你愿意的话,它们应该在"叶子的末端"。特别是通用库通常只展示完成特定任务的函数(例如加密某些东西)。
想想看,你在运行时只能从库中导入一个函数。库不可能知道你的整个程序状态并与之进行有意义的交互。
一切都归结为设计。如果您自己设计库,并且您希望在运行时加载程序的完整部分,那么您必须提供大量的回调接口。但是,如果库是紧密耦合的,则可以考虑将其直接链接到主程序中。
最后,由于dlopen
风格的接口只处理c风格的函数指针,因此基本上只能使用c风格的接口。如果您愿意,也可以传递函数指针,但请参阅上面关于这是否会导致良好设计的注意事项。拥有一个c++接口(例如导出通过引用获取类的函数)要棘手得多,因为你必须确保库(以及所有第三方提供的库的未来版本)符合相同的ABI,而c++ ABI比C ABI复杂得多,而且容易改变。
可以这样想:如果你想要一个插件架构,第三方可以在以后为你的程序编写可以使用的代码,那么使用运行时加载。如果没有意义,请在编译时使用普通链接。
相关文章:
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 如何在嵌入式浏览器和Webside之间进行双向通信
- C++程序和未识别程序之间的双向通信
- BOOST :: ASIO :: TCP双向通信在插座上
- Boost::ASIO:使用两个进程的双向通信
- 使用 UDP 的双向通信程序无法正常工作
- Unix如何双向管道通信
- 串行连接上的双向C++通信
- C# 命名管道双向通信
- 双向通信 C# 代码和非托管C++库
- 使用命名管道的双向C++到 C# 通信
- 使用Websockets在两个设备之间进行双向通信
- 非托管代码和unity3d代码之间的双向通信
- 双向函数调用(C++动态库)
- boost::asio -服务器之间的冲突,双向通信
- 双向通信Python和c++
- 与主执行模块和动态库双向通信
- 与Thrift或协议缓冲区的双向通信
- 子进程和父进程之间的交互式双向通信(使用管道)
- Android, SWIG和双向通信