簡體   English   中英

混合來自不同編譯器的C ++代碼

[英]Mixing C++ code from different compilers

假設我有兩個項目要聯系在一起:

  • 用Visual C ++編譯為DLL文件的C ++庫。
  • 使用C ++ Builder編譯的C ++可執行文件,它使用庫中的類。

我意識到沒有標准的C ++ ABI,任何將這兩個C ++項目直接鏈接在一起的嘗試都會失敗。 什么是創建兼容性層的好的,自動化的方式,允許我完成此任務?

例如,可以想象C ++庫可以通過C接口暴露自己。 然后,可執行文件將包含一些C ++類,這些類包裝C ++庫公開的C接口。 既然標准ABI為C,它會工作。

唯一的問題是如何自動創建C接口和C ++包裝類 - 手動維護這不是一個選項。 SWIG項目看起來很有希望,但不幸的是,C ++並不是他們網站上列出的SWIG的出口之一。 有沒有辦法用SWIG做我想做的事情? 或者除了SWIG之外還有其他項目可以幫助我完成這項任務嗎?

或者我是以錯誤的方式來做這件事的?

編輯:核心C ++庫旨在跨平台。 顯然,可執行文件是特定於Windows的。 我不想污染核心庫,以至於無法在其他平台上編譯它。

如果它只需要在Windows上運行,我會將這些類公開為COM對象。 它們仍然在DLL中,它們可以被任何理解COM的語言使用。

在Windows中,執行此操作的“標准”方法是使用COM對象。 所以,這當然是一個很好的選擇。 在Linux系統中,模塊交互模型(例如,可執行DLL交互)是非常不同的,並且C ++存在ABI。

如果您想手動執行此操作(創建自己的類似COM的庫),可能需要認真考慮許多棘手的問題。 你需要一個跨模塊的RTTI系統,你需要一個接口查詢/定義協議,一些管理模塊內存的機制等等。除此之外,為了“自動化”它,你可能需要組合MACRO和模板元函數。

我強烈推薦您考慮或至少考慮的一個跨平台選項是使用Boost.Python和Python語言作為模塊之間的“粘合劑”。 Boost.Python庫基本上完成了“類的自動導出/導入”,但它將您的C ++類和函數導出為Python類和函數。 並且,它完全是非侵入式和跨平台的,因此這實際上是自動導出的理想示例。 因此,您可以考慮使用Python編寫高級粘合代碼,或者使用Python作為C ++模塊之間的中間件,甚至可以重新編寫Boost.Python庫以僅使用“自動導出”機制導出到任何接口您設計或使用的系統。

我相信還有很多其他類似的庫。 但第一個問題當然是,你真的需要這個嗎? 你可能正在用火箭筒殺死一只蒼蠅。

為什么不用C ++ builder來編譯庫呢?

瀏覽swig(我知道swig應該能夠用C語言包裝C ++): SWIG和C ++

如果核心庫是跨平台的,為什么不將UI編寫為跨平台的Qt應用程序,並在Windows上用Visual C ++構建所有內容。

暫無
暫無

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

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