2012-09-07 16 views
4

我正在爲Mac OS編寫一個瀏覽器插件,它會在狀態欄中放置一個狀態欄圖標,用戶可以使用該圖標與瀏覽器插件進行交互。我已經在XCode 4.4.1中成功構建了FireBreath 1.6項目,並且可以將其安裝在瀏覽器中。然而,FireBreath使用C++,而大部分的Mac OS的現有的庫都寫在Objective C.如何將Objective C代碼添加到FireBreath項目?

在/Mac/projectDef.make文件,我添加了可可框架和基礎框架,提出here和在其他資源,我在網上查到:

target_link_libraries(${PROJECT_NAME} 
    ${PLUGIN_INTERNAL_DEPS} 
    ${Cocoa.framework} # added line 
    ${Foundation.framework} # added line 
) 

我重新prepmac.sh,期待一個新的項目在Xcode中創建與我.mm文件和.m文件;但是,似乎他們被忽略了。我只看到.cpp和.h文件。我說對於那些在projectDef.make文件規則,但它似乎不有所作爲:

file (GLOB PLATFORM RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
    Mac/[^.]*.cpp 
    Mac/[^.]*.h 
    Mac/[^.]*.m #added by me 
    Mac/[^.]*.mm #added by me 
    Mac/[^.]*.cmake 
) 

即使我加入手動文件,我得到了一系列的編譯錯誤。有關於他們的20,所有相關的文件NSObjRuntime.h文件:

Parse Issue - Expected unqualified-id 
Parse Issue - Unknown type name 'NSString' 
Semantic Issue - Use of undeclared identifier 'NSString' 
Parse Issue - Unknown type name 'NSString' 
... 
... 
Semantic Issue - Use of undeclared identifier 'aSelectorName' 
... 
... 
Semantic Issue - Use of undeclared identifier 'aClassName' 
... 

它繼續這樣一段時間,類似的錯誤...

從我讀過,這些錯誤出現,因爲我相信我已經包含在該項目中的Foundation Framework的依賴關係。我也嘗試點擊XCode中的項目

我到了現在的位置,我不知道接下來要嘗試什麼。人們說在C/C++代碼中使用Objective C並不困難,但對XCode和Objective C來說是新的可能會造成我的困惑。這對我來說只是第四天在這個新的平臺上。

我需要做什麼才能讓XCode編譯Objective C代碼?請記住,我對此有點新,所以如果您留下詳細的答案,而不是標籤中常見的模糊單行,我會很感激。我的頭腦裏有一點點,但如果你能讓我通過這個障礙,我肯定我會很開心。

UPDATE:

我編輯的項目/爲myplugin /的CMakeLists.txt,並在.M和.mm規則添加有太多。在運行prepmac.sh之後,這些文件包含在項目中,但我仍然收到相同的編譯錯誤。

我將所有.h文件和.mm文件從Obj C代碼移動到MyPlugin根文件夾並重新執行prepmac.sh文件。問題依然存在。相同的編譯錯誤。

回答

2

您的問題是,您有.h文件包含在C++文件中,這些文件具有目標c類型和/或包含在其中。爲了做你想做的事情,你所有的C++使用的類都需要在#ifdef中保留所有的obj c相關的東西,或者不要在頭文件中暴露任何obj c。

例如,你可以在你的頭使用IFDEF:

#ifdef __OBJC__ 
    // Objective C/C++ code here 
#endif 

重要的是要記住,.h文件是包括以及頭文件,所以其實包括很重要的。如果您在.cpp文件中包含目標c代碼,編譯器會感到困惑和哭泣。


編輯:要記住的最重要的事情是,你需要確保任何客觀的C頭文件(或其他文件與目標C代碼)不從cpp文件包括在內。如果你能做到這一點,你會沒事的。

+0

所以如果我包含開源Objective C代碼,那麼我需要編輯每個頭文件?我讀了一些關於使用Prefix.pch文件作爲避免這種情況的方法,甚至在Objective C項目示例中看到了一個,但我還沒有弄清楚如何將它包含在FireBreath項目中。 +1,這一定會讓我走上正軌!感謝您抽出寶貴的時間與我們聯繫!你說得對! CMake是一種痛苦,但我可以看到它的必要性:) :) – jmort253

+0

no no no。如果你包含開源的目標C代碼,你需要*不包括頭文件中的頭文件,這些頭文件也將包含在C++文件中。或者將#import包裝在#ifdef語句中以防止它被包含在cpp文件中 – taxilian

+0

好吧,我認爲現在開始有意義。我離開了Mac工作,所以我會在星期一嘗試一下。再次感謝! :) – jmort253

相關問題