4

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

在 /Mac/projectDef.make 文件中,我添加了 Cocoa 框架和 Foundation 框架,正如这里和我在 Internet 上找到的其他资源中所建议的那样:

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个左右,都和fileNSObjRuntime.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 代码?标签中常见的模糊单行字,我将不胜感激。我只是有点过头了,但如果你能让我越过这个障碍,我相信我会很好地从那里开始。

更新:

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

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

4

1 回答 1

2

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

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

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

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


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

于 2012-09-08T03:20:04.330 回答