簡體   English   中英

交叉編譯庫通信

[英]Cross-compiler library communication

我需要使用MSVC開發一個C ++前端GUI,它需要與使用C ++ Builder編譯的bank-end庫進行通信。

我們如何定義接口以便不會遇到CRT庫問題?

例如,我相信我們將無法安全地來回傳遞STL容器。 真的嗎?

我知道我可以安全地傳遞POD類型,但我希望我也可以使用一些更復雜的數據結構。

您可能會發現本文有趣的二進制兼容C ++接口 一般的教訓是,永遠不要通過STL容器,提升或任何類似的東西。 與其他兩個答案一樣,您最好的選擇是堅持使用指定的調用約定的POD和函數。

由於STL的實現因編譯器而異,因此傳遞STL類是不安全的。 然后,您可以要求用戶使用STL的特定實現(也可能是特定版本),或者只是不使用庫之間的STL。

進一步堅持使用調用約定,其中行為可以被認為是交叉編譯器。 例如, __cdecl__stdcall將在大多數編譯器上同等處理,而__fastcall調用約定將是一個問題,特別是如果您希望在C ++ Builder中使用代碼。

正如文章“ 二進制兼容的C ++接口 ”所提到的,你也可以使用接口,只要你記住一些基本原則。

  1. 始終使接口成為純虛擬類(這不是實現)。
  2. 確保對接口中的成員函數使用正確的調用約定(文章提到了Windows的__stdcall
  3. 保持內存清理在DLL邊界的同一側。
  4. 還有很多其他的東西,比如不使用異常,不要在界面中重載函數(編譯器對待它的方式不同)等等。在文章的底部找到它們。

如果您選擇使用C ++接口,您可能想要閱讀有關組件對象模型(COM)的更多信息,以了解這將如何以及為何能夠跨編譯器工作。

您應該能夠傳遞可以通過C接口安全傳遞的數據,換句話說就是POD。 通過常規C或C ++函數調用傳遞的POD之上的所有內容都將遇到不同對象布局和運行時庫的不同實現的問題。

如果你非常小心如何將它們放在內存中並確保兩個編譯器都使用相同的數據打包等,你可能會傳遞POD的結構。除了C結構之外,你幾乎有一個小溪/槳問題。

為了傳遞更復雜的數據類型,我將研究對象組件技術,如COM,CORBA或其他允許您進行遠程或跨進程函數調用的技術。 這些將解決編譯器和進程之間的數據編組問題,從而解決您的“僅限pod”問題。

或者你可以使用C ++ - Builder編寫前端,並為自己省去很多悲傷和頭痛。

我在傳遞STL-Containers時遇到問題,即使使用相同的STL-Implementation,但設置了不同級別的調試信息等。因此,傳遞POD將是正常的。 C ++容器幾乎肯定會導致問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM