2010-10-05 139 views
3

我需要开发一个使用MSVC的C++前端GUI,它需要与使用C++ Builder编译的bank-end库进行通信。交叉编译器库通信

我们如何定义接口以避免遇到CRT库问题?

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

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

回答

4

你可能会觉得这篇文章有趣Binary-compatible C++ Interfaces。一般的教训是,绝对不要传递STL容器,提升或类似的东西。像其他两个答案一样,您最好的选择是坚持使用指定调用约定的POD和函数。

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

更进一步坚持调用约定,行为可以视为交叉编译器frieindly。例如__cdecl__stdcall将在大多数的编译器同样处理,而__fastcall调用约定将是一个问题,特别是如果你想使用的代码在C++ Builder中。

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

  1. 总是使接口纯虚拟类(这是没有实现)。
  2. 请确保为接口中的成员函数使用适当的调用约定(文章提到Windows的__stdcall
  3. 保持内存清理位于DLL边界的同一侧。
  4. 还有一些其他的东西,比如不要使用异常,不要在接口中重载函数(编译器会以不同的方式处理)等等。在文章底部找到它们。

如果您选择使用C++接口,可能需要了解更多关于组件对象模型(COM)的知识,以了解如何以及为何它能够跨编译器工作。

+0

这个工程 - 我在工作中尝试过。它可以在调试和发布版本之间工作(可以混合使用),它可以在同一平台上的不同编译器上工作(例如MSVC和BCB) – 2010-10-07 11:23:14

2

您应该能够传递可以通过C接口安全传递的数据,换言之,POD。一切由C或C++函数调用传递的POD上的所有内容都会遇到不同对象布局和运行时库不同实现的问题。

如果你非常小心你如何将它们放在内存中,并确保两个编译器使用相同的数据打包等,你可能会通过POD结构。除了C结构之外,你几乎都有一个小河/桨问题。

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

或者你可以使用C++ Builder编写前端,并为自己节省很多的痛苦和头痛。

1

我甚至通过STL的容器在使用同样的STL-实现的时候,不过话说设置不同级别的调试信息等,因此传递荚将确定遇到了问题。 C++容器几乎肯定会导致问题。