如何将Objective C代码添加到FireBreath项目?

时间:2012-09-07 21:20:30

标签: c++ objective-c macos osx-lion firebreath

我正在为Mac OS编写一个浏览器插件,它会在状态栏中放置一个状态栏图标,用户可以使用该图标与浏览器插件进行交互。我已经在XCode 4.4.1中成功构建了一个FireBreath 1.6项目,并可以在浏览器中安装它。但是,FireBreath使用C ++,而Mac OS的大多数现有库都是用Objective C编写的。

在/Mac/projectDef.make文件中,我按照建议here以及我在互联网上找到的其他资源添加了Cocoa框架和基础框架:

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

我重新使用prepmac.sh,期望在我的.mm文件和.m文件中在XCode中创建一个新项目;然而,似乎他们被忽视了。我只看到.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不熟悉可能会引起我的困惑。在这个新平台上,这对我来说只是第4天。

我需要做些什么才能让XCode编译Objective C代码?请记住,我对此有点新意,所以如果你留下详细的答案而不是标签中常见的模糊单行,我会很感激。我只是有点头脑,但如果你能让我超越这个障碍,我肯定我会很高兴从那里出发。

更新

我编辑了项目/ MyPlugin / CMakeLists.txt,并在那里添加了.m和.mm规则。运行prepmac.sh后,文件包含在项目中,但我仍然得到相同的编译错误。

我将所有.h文件和.mm文件从Obj C代码移动到MyPlugin根文件夹并重新启动了prepmac.sh文件。问题仍然存在。相同的编译错误。

1 个答案:

答案 0 :(得分:2)

您的问题是您有.h文件,这些文件包含具有目标c类型和/或包含在其中的C ++文件。为了做你想要的事情,c ++使用的所有类都需要在#ifdef中保存所有与obj相关的东西,或者只是不在头文件中暴露任何obj c。

例如,您可以在标题中使用此ifdef:

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

重要的是要记住.h文件是包含以及头文件,所以它们实际上是包含在内的。如果在.cpp文件中包含目标c代码,编译器就会感到困惑和哭泣。


编辑:最重要的是要记住,您需要确保cpp文件中不包含任何目标c头文件(或具有客观c代码的其他文件)。如果你能做到这一点你会没事的。