第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將巨大的 C++ 庫自動包裝到 C 以在 Swift / Go 中導入

將巨大的 C++ 庫自動包裝到 C 以在 Swift / Go 中導入

Go
qq_花開花謝_0 2022-03-02 19:25:39
假設我在 C++ 中有一個巨大的庫(具有大量依賴項,在 GCC 下完整構(gòu)建需要大約 3 小時)。我想在該庫的基礎上進行構(gòu)建,但不想在 C++ 中這樣做,而是使用更高效的語言。我如何才能真正橋接或包裝那個 extern lib 包,以便我可以用另一種語言訪問它并在它之上編程?考慮的語言:迅速走我發(fā)現(xiàn),這兩種語言確實為 C 庫和代碼提供了自動橋接或包裝(我實際上不知道包裝/橋接之間的區(qū)別)。所以,如果我有一些 c 代碼,我可以將它放在同一個 Swift 或 Go 項目中,并可以在我的項目中通過簡單的導入來使用它。然而,這不適用于兩種語言的 C++ 代碼。所以我用谷歌搜索了如何將 C++ 庫轉(zhuǎn)換為 C 代碼或生成自動包裝器。我發(fā)現(xiàn)了以下內(nèi)容:swig.org - C++ 庫的自動包裝器Comeau C++ 編譯器 - 自動將 C++ 轉(zhuǎn)換為 C 代碼LLVM - 應該能夠接受任何輸入并將其轉(zhuǎn)換為LLVM 能夠提供的任何輸出。題:如果使用自動包裝或自動橋接,在 Swift / Go 等其他語言的如此龐大的庫之上構(gòu)建是否甚至在可用/現(xiàn)實/可管理的領域?列出的 3 個庫 / 程序 / 框架中的哪一個最適合 C++ -> C 的過程(因為 Swift 和 Go 都提供 C 自動包裝)。有沒有比我目前考慮的更好的選擇?僅僅“堅持使用 C++”會更好嗎,因為使用任何其他工具來進行包裝/橋接過程將遠遠超過使用 Swift / Go 等更高效語言的好處?謝謝:)免責聲明:也可以在 C 中手動包裝 C++ 庫,但對于如此龐大的庫來說,這將花費大量的工作。
查看完整描述

2 回答

?
精慕HU

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++ 中,你必須這樣做:

  1. 打開文件

  2. 讀取流,直到找到 SLIP 終止符

  3. 讀一個“記錄”

  4. 關閉文件

使用外觀,您可以創(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ù)量。


查看完整回答
反對 回復 2022-03-02
?
千巷貓影

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ā)布)中設置庫搜索路徑)


查看完整回答
反對 回復 2022-03-02
  • 2 回答
  • 0 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號