交叉编译库通信

时间:2010-10-05 14:04:41

标签: c++ visual-c++ c++builder cross-compiling

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

我们如何定义接口以便不会遇到CRT库问题?

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

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

3 个答案:

答案 0 :(得分:4)

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

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

进一步坚持使用调用约定,其中行为可以被认为是交叉编译器。例如,__cdecl__stdcall将在大多数编译器上同等处理,而__fastcall调用约定将是一个问题,特别是如果您希望在C ++ Builder中使用该代码。

正如文章“ Binary-compatible C ++ Interface ”所提到的,你也可以使用界面,只要你记住一些基本原则。

  1. 始终将接口设为纯虚拟类(这不是实现)。
  2. 确保为界面中的成员函数使用正确的调用约定(文章提到了Windows的__stdcall
  3. 保持内存清理在DLL边界的同一侧。
  4. 还有很多其他的东西,比如不使用异常,不要在界面中重载函数(编译器对待它的方式不同)等等。在文章的底部找到它们。
  5. 如果您选择使用C ++接口,您可能希望阅读有关组件对象模型(COM)的更多信息,以了解这将如何以及为何能够跨编译器工作。

答案 1 :(得分:2)

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

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

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

或者您可以使用C ++ - Builder编写前端,并为您节省很多悲伤和头痛。

答案 2 :(得分:1)

我在传递STL-Containers时遇到问题,即使使用相同的STL-Implementation,但设置了不同级别的调试信息等。因此,传递POD会没问题。 C ++容器几乎肯定会导致问题。