2 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
Q1:現(xiàn)實嗎?
不現(xiàn)實,因為任何大型復雜的 C++ 互操作都會變得過于復雜。自動工具很可能會失敗,而手動工作太難了。
Q2:什么是最好的?
我不知道,鑒于 A1 這似乎無關緊要。
Q3:替代方案?Q4:C++ 只是最好的選擇嗎?
如果您想利用來自另一種語言的現(xiàn)有 C++ 代碼,而不管涉及哪種語言,復雜場景中的最佳選擇是使用混合方法。
由于非標準 C++ 命名約定,大多數(shù)語言提供與 C 而不是 C++ 的互操作。換句話說,幾乎每種語言都提供對普通 C 函數(shù)的訪問,但 C++ 通常不受支持。
由于您的庫很復雜,因此最好的解決方案是基于“Facade”模式。創(chuàng)建一個新的 C 庫并實現(xiàn)利用 C++ 庫的應用程序特定邏輯。嘗試將此庫設計為盡可能薄。目標不是編寫所有業(yè)務邏輯,而是提供保存 C++ 對象并調(diào)用 C++ 函數(shù)的 C 函數(shù)。然后,GO 級語言代碼將調(diào)用此庫以使用下面的 C++ 庫。這種方法不同于 Q1 方法。在 Q1 中,您嘗試對每個 C++ 函數(shù)或?qū)ο蟮姆椒ㄟM行一次互操作調(diào)用。在 Facade 中,您嘗試實現(xiàn)應用程序獨有的 C++ 使用場景。
使用 Facade,您可以減少互操作工作的范圍,因為您針對的是應用場景。同時,您可以減輕 GO 語言級別的 C++ 復雜性。
例如,您需要使用 C++ 庫讀取溫度傳感器。
在 C++ 中,你必須這樣做:
打開文件
讀取流,直到找到 SLIP 終止符
讀一個“記錄”
關閉文件
使用外觀,您可以創(chuàng)建一個名為“readTemperature(deviceFileName)”的函數(shù),并且該 C 函數(shù)一次執(zhí)行 4 個調(diào)用。
這是一個假的例子,只是為了說明這一點。
使用外觀你可能想要隱藏原始 C++ 對象,此時它變成了一個小層。這里的目標是保持專注并平衡您的應用程序需求與泛化以支持您的應用程序。
有趣的是,F(xiàn)acade 方法是提高互操作性能的一種方法。由于需要從語言運行時環(huán)境編組并對其進行保護,幾乎每種語言的互操作都比正常操作更昂貴。許多互操作調(diào)用會減慢應用程序的速度(我們在這里談論的是數(shù)百萬)。例如,將 10 個互操作調(diào)用合并為 1 個可以提高性能,因為減少了 itnerop 操作的數(shù)量。

TA貢獻1829條經(jīng)驗 獲得超7個贊
我使用一個相對簡單的過程成功地在 Swift 中包裝了一個大型(盡管可能不是“巨大”)C++ 庫(數(shù)百個頭文件)。您直接將項目鏈接到庫。您唯一需要包裝的是您編寫的(將在 Swift 中調(diào)用)實際使用庫(在 C++ 包裝文件中)的任何新函數(shù)。冗長的東西可以留在包裝文件中,大多數(shù)情況下不做任何修改。有一個簡單的小教程對我有幫助:https ://www.swiftprogrammer.info/swift_call_cpp.html
(僅供參考,他省略了一個步驟:在 Build Settings => Search Paths => Library Search Paths(調(diào)試和發(fā)布)中設置庫搜索路徑)
- 2 回答
- 0 關注
- 234 瀏覽
添加回答
舉報