我需要开发一个使用MSVC的C++前端GUI,它需要与使用C++ Builder编译的bank-end库进行通信。交叉编译器库通信
我们如何定义接口以避免遇到CRT库问题?
例如,我相信我们将无法安全地来回传递STL容器。真的吗?
我知道我可以安全地传递POD类型,但我希望我也可以使用一些更复杂的数据结构。
我需要开发一个使用MSVC的C++前端GUI,它需要与使用C++ Builder编译的bank-end库进行通信。交叉编译器库通信
我们如何定义接口以避免遇到CRT库问题?
例如,我相信我们将无法安全地来回传递STL容器。真的吗?
我知道我可以安全地传递POD类型,但我希望我也可以使用一些更复杂的数据结构。
你可能会觉得这篇文章有趣Binary-compatible C++ Interfaces。一般的教训是,绝对不要传递STL容器,提升或类似的东西。像其他两个答案一样,您最好的选择是坚持使用指定调用约定的POD和函数。
由于STL的实现因编译器而异,因此传递STL类并不安全。然后,您可以要求用户具体实现STL(也可能是特定的版本),或者不使用库之间的STL。
更进一步坚持调用约定,行为可以视为交叉编译器frieindly。例如__cdecl
和__stdcall
将在大多数的编译器同样处理,而__fastcall
调用约定将是一个问题,特别是如果你想使用的代码在C++ Builder中。
正如文章“兼容二进制的C++接口”所提及的,您也可以使用接口,只要您记住一些基本原则。
__stdcall
如果您选择使用C++接口,可能需要了解更多关于组件对象模型(COM)的知识,以了解如何以及为何它能够跨编译器工作。
您应该能够传递可以通过C接口安全传递的数据,换言之,POD。一切由C或C++函数调用传递的POD上的所有内容都会遇到不同对象布局和运行时库不同实现的问题。
如果你非常小心你如何将它们放在内存中,并确保两个编译器使用相同的数据打包等,你可能会通过POD结构。除了C结构之外,你几乎都有一个小河/桨问题。
为了传递更复杂的数据类型,我会研究像COM,CORBA或其他允许您进行远程或跨进程函数调用的技术。这些将解决编译器和进程之间编组数据的问题,从而解决您的“仅限pod”问题。
或者你可以使用C++ Builder编写前端,并为自己节省很多的痛苦和头痛。
我甚至通过STL的容器在使用同样的STL-实现的时候,不过话说设置不同级别的调试信息等,因此传递荚将确定遇到了问题。 C++容器几乎肯定会导致问题。
这个工程 - 我在工作中尝试过。它可以在调试和发布版本之间工作(可以混合使用),它可以在同一平台上的不同编译器上工作(例如MSVC和BCB) – 2010-10-07 11:23:14