2015-01-11 59 views
0

我試圖將一個簡單的Swift應用程序(here)從使用Swift數據模型轉換爲C++模型。我發現了一篇關於用Obj-C++封裝C++代碼的文章(here),以便將C++模型暴露給Swift。來自橋接頭的C++頭問題Obj-C++

我已經完成了轉換,並沒有編譯器警告/錯誤,直到我將我的Obj-C++「包裝器」標題放入<xx>-Bridging-Header.h。在橋接頭文件中,我有一個#include到我的Obj-C++「包裝器」頭文件。 Obj-C++包裝類當然直接鏈接到我的C++類頭。試圖編譯時,我從Swift中得到一個錯誤,找不到<unordered_map>

這很有道理,因爲我不希望Swift知道關於C++或其任何頭文件的任何信息。我認爲橋接頭的意義在於Obj-C++編譯器能夠適當地啓動和編譯代碼。

在構建設置中,我確保在LLVM 6.0 C++編譯器設置下使用C++ 11編譯器標誌。但是,似乎並沒有使用除Swift之外的其他編譯器。而且,從C取出<unordered_map>依賴++頭也再找不到<vector>,所以我相信這無關與C++ 11

如果任何人都可以在正確的方向指向我在這裏將不勝感激!

回答

0

在線搜索我能找到的唯一例子正是我想要做的 - 但沒有實際的類。每個例子基本上都是C頭和實現,但是有STL支持。在沒有找到有關這個問題的相關信息之後,我開始了一些毫不知情的人傾向於做的事 - 盲目修補。

我發現關注Obj-C++「包裝器」文件到C++模型。最初我以純粹的C++方式處理我的#include:在Obj-C++包裝器頭文件中,我包含了我的C++ Model頭文件。

我遵循這一點,並且在.mm實現文件中也有匹配的#include(正如我在C++課程中教過的)。

類似於一個國家從另一個國家解散,並改變他們的所有習俗是爲了給母國指手畫腳,顯然NeXT與C++做了同樣的事情。頭文件(除了它們的Foundation)想要屬於實現文件只有

更改我的代碼後,遵循這個其他編譯器警告很容易解決,項目編譯得很好。

在來到這個解決方案之前,我已經放棄了我的想法,即必須從C++文件中創建一個動態庫並將它們合併到項目中。這仍然是一個可行的選擇,並且在某些情況下可能是首選(儘管存在少量的開銷)。