2010-10-05 88 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++容器幾乎肯定會導致問題。