【问题标题】:Cross Compiler Library Interaction (Dynamic Loading) (plugins)交叉编译器库交互(动态加载)(插件)
【发布时间】:2014-02-03 11:06:42
【问题描述】:

这是一个验证我的推理的问题。

无论如何,我正在开发一个支持插件(在运行时动态加载的库)的复杂项目,现在我希望能够使用编译器 X 编译主程序,并使用编译器 Y 编译插件,并且该插件仍然有效。 但是我需要在插件和主程序之间传递复杂的数据。

所以我的理解是,只要我知道它们将执行相同基本代码的地址,标准函数就可以了,编译器无关紧要。

但是,当涉及到结构时,由于编译器之间的对齐/打包方法不同,2 个相同的结构可能不一样,但是我可以在大多数编译器上使用 #parama pack(n) 覆盖它,只要这是相同的这些结构的内存结构将匹配,以便它们可以在插件和主程序之间传递。

那么我相信这也适用于基本类,只要没有虚函数,并且所有成员变量都是公共的。

但是我不能依赖成员函数的调用约定,所以我必须要么通过将对象作为参数的标准函数映射它们,要么在插件命名空间中重新实现它们,很可能通过与其链接的库反对。

此外,只要按上述方式实现,我应该能够为结构/类实现运算符和成员函数。

因此我可以使用它在插件和程序之间传递复杂的数据,即使它们是用不同的编译器编译的。

我的理解是否正确?

【问题讨论】:

    标签: c++ memory compiler-construction struct shared-libraries


    【解决方案1】:

    是的,您似乎掌握了其中的大部分要点。本质上,DLL 必须只公开一个 C 级接口,而不是 C++ 提供的许多漂亮特性。 (当然,仍然可以在内部使用 C++。)

    您没有提到的重要一点是,插件分配的任何内存都必须由同一个插件释放。同样,主程序必须是释放它分配的任何东西的程序。您可以来回传递内存地址并很好地使用它们,但解除分配是一种特殊情况,因为不同的编译器可能使用其堆的不同实现。因此,如果一个人试图清理一开始并没有责任的内存,就会发生不好的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多