首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉编译库通信

交叉编译库通信
EN

Stack Overflow用户
提问于 2010-10-05 22:04:41
回答 3查看 342关注 0票数 3

我需要使用MSVC开发一个C++前端图形用户界面,它需要与使用C++生成器编译的银行端库进行通信。

我们如何定义我们的接口,使我们不会遇到CRT库问题?

例如,我相信我们将无法安全地来回传递STL容器。这是真的吗?

我知道我可以安全地传递POD类型,但我希望我也能使用一些更复杂的数据结构。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-07 19:05:26

您可能会发现这篇文章很有趣,Binary-compatible C++ Interfaces。通常的教训是,永远不要传递STL容器、boost或任何类似的东西。与其他两个答案一样,您最好的选择是坚持使用指定了调用约定的PODs和函数。

由于STL的实现因编译器而异,因此传递STL类是不安全的。然后,您可以要求用户使用STL的特定实现(可能还有特定的版本),或者干脆不在库之间使用STL。

此外,坚持调用约定,在这种情况下,行为可以被认为是友好的交叉编译器。例如,__cdecl__stdcall将在大多数编译器上同等处理,而__fastcall调用约定将是一个问题,特别是如果您希望在C++生成器中使用代码的话。

正如“二进制兼容的C++接口”一文中提到的,只要你记住一些基本原则,你也可以使用接口。

  1. 总是使接口成为纯虚类(也就是说,确保对接口中的成员函数使用适当的调用约定)(文章提到了__stdcall for Windows.dll
  2. 在DLL的同一侧保持内存清理,还有许多其他事情,比如不使用异常,不在接口中重载函数(编译器对此有不同的处理方式),等等。这些都可以在文章的末尾找到。

如果您选择使用C++接口,您可能希望阅读有关组件对象模型(COM)的更多信息,以了解这将如何以及为什么能够在编译器之间工作。

票数 4
EN

Stack Overflow用户

发布于 2010-10-05 22:16:58

您应该能够传递可以通过C接口安全传递的数据,换句话说,就是PODs。常规C或C++函数调用传递的PODs之外的所有内容都会遇到不同的对象布局和运行时库的不同实现的问题。

如果你非常注意如何在内存中放置PODs的结构,并确保两个编译器使用相同的数据打包等,那么你可能能够传递PODs的结构。除了C结构之外,你很可能会遇到creek/paddle问题。

为了传递更复杂的数据类型,我将研究对象组件技术,如COM、CORBA或其他允许您进行远程或跨进程函数调用的技术。这将解决在编译器和进程之间编组数据的问题,从而解决您的“pod-only”问题。

或者你可以使用C++-Builder编写前端,这样可以省去很多麻烦和麻烦。

票数 2
EN

Stack Overflow用户

发布于 2010-10-05 22:19:57

我在传递STL容器时遇到了问题,即使使用相同的STL实现,但设置了不同级别的调试信息等。因此传递PODs就可以了。C++容器几乎肯定会导致问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3864386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档