gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:00:44 29 4
gpt4 key购买 nike

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

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

所以我的理解是标准函数很好,只要我知道编译器将执行相同的基本代码的地址,编译器就没有关系。

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

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

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

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

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

我的理解正确吗?

最佳答案

是的,你似乎掌握了大部分要点。本质上,DLL 必须仅公开 C 级接口(interface),而不是 C++ 提供的许多漂亮功能。 (尽管当然仍然可以在内部使用 C++。)

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

关于c++ - 交叉编译器库交互(动态加载)(插件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21129646/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com