交叉编译器库交互(动态加载)(插件)

时间:2014-01-15 05:19:32

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

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

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

所以我的理解是标准函数很好并不重要,只要我知道它们将执行相同基本代码的地址。

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

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

但是我不能放弃成员函数的调用约定,所以我必须通过将对象作为参数的标准函数映射它们,或者在插件命名空间中重新实现它们,最有可能通过它链接的库对

更多我应该能够为结构/类实现运算符和成员函数,只要它们如上所述实现。

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

我的理解是正确的吗?

1 个答案:

答案 0 :(得分:4)

是的,你似乎有很多重要的观点。本质上,DLL必须只公开C级接口,而不是C ++提供的许多漂亮功能。 (虽然当然在内部仍然可以使用C ++。)

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