3

所以我想在我的 cocos2d + box2d 项目中公开一个 Box2D (C++) 指向其他 Objective-C++ 类的指针。我在我的接口中声明了一个方法“getWorld”,它引用了 C++ 类 b2World 并导入了 Box2D.h。我项目中的所有文件都是 .mm 扩展名,我收到以下编译错误:

In file included from DebugDrawLayer.mm:2:
In file included from World.h:10:
In file included from external/Box2d/Box2D/Box2D.h:34:
external/Box2d/Box2D/Common/b2Settings.h:22:10: fatal error: 'cassert' file not found
#include <cassert>

我猜 Box2D.h 以某种方式编译为 C 而不是 C++,但我不明白这是怎么发生的。根据日志,包含链显然是从 .mm 文件开始的。

更新:

日志显示 World.mm(较早编译)清楚地编译为objective-c++

CompileC Objects-normal/i386/World.o World.mm normal i386 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler 

但是对于 DebugDrawLayer.mm 它说的是objective-c

CompileC Objects-normal/i386/DebugDrawLayer.o DebugDrawLayer.mm normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler

这两个文件都设置为默认值 - Objective-C++ 源代码。是什么赋予了..?

4

6 回答 6

19

这似乎是 Xcode4 中的一个主要错误,与编译器设置无关 - 只是 Xcode 内部。


更新:

我终于找到了根本原因。是的,这是 Xcode/LLVM 中的一个错误。它以错误的顺序编译文件,然后覆盖自己的设置,并自行中断。苹果的技术支持太无能,甚至无法理解这个问题,所以我怀疑他们很快就会修复这个错误。

(注意:跳过本节,并在下面查看我的原始答案,这给出了一个蛮力但非常快速的解决方案)

会发生什么......如果编译器在处理C 类时“看到”一个 C++ 头文件......然后它(内部)将该头文件标记为“C”(即使这实际上是不可能的)。

后来,当它回到那个头文件,试图用 C++ 编译它时,它发现它已经告诉自己头文件是“C”(因为它非常愚蠢)......并立即崩溃。

正确的解决方案(需要大量时间和精力)是检查项目中的每个 C 文件,并检查(手动,因为 Xcode 很烂)对每个头文件的每个引用——并且,对于每个头文件,它进口...等

(这可能需要几个小时)

...直到您找到导致 C 文件“看到”C++ 标头的导入链。

所有这些都应该是自动化的(但不是)。并且根本问题不应该发生(如果 Xcode 编写正确的话)。


我尝试了网络上其他地方列出的所有内容,大多数解决方案都是“不断删除/添加文件,如果幸运的话,Xcode 最终会自行修复”。

我不走运。唯一有效的是:

  1. 转到为您的项目构建设置
  2. 找到“将源编译为”设置
  3. 将其设置为“Objective-C++”
  4. 重建

实际的名称/值是:“GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp” - 所以我的猜测是这回避了 Xcode(坏了!)的内部逻辑。

于 2012-08-24T06:15:28.580 回答
3

我有同样的错误,我刚刚将我的一个类(我称之为 box2d 类)从 className.m 重命名为 className.mm,现在它可以工作了。

于 2013-05-20T08:32:08.597 回答
1

我在我的 Cocos2D/Box2D 项目中遇到了这个问题,直到我将.m项目中的所有文件(当然不包括 Cocos2D 中的文件)重命名为.mm将它们编译为 Objective-C++ 后才解决。

我猜@Adam 的解决方案也可以,但我更喜欢将编译设置保留为“根据文件类型”,感觉更干净。

于 2012-11-16T14:28:51.833 回答
0

从项目中删除 DebugDrawLayer 然后重新添加它可以解决问题。也许在构建阶段设置中的文件中有一些奇怪的编译器设置,从未检查过这些。

于 2012-08-22T12:16:27.380 回答
0

实际上正确的解决方案是将您的代码放入:

#if __cplusplus

// … your code … 

#endif // __cplusplus
于 2013-09-04T22:17:51.697 回答
0

#import "Box2D.h"我在进入时遇到了这个问题Prefix.pch。我将其更改#import "Box2D.h"为在每个使用它的文件中。

于 2013-10-23T17:44:11.467 回答