所以我想公开公开一个 Box2D (C++) 指针,指向我的 cocos2d + box2d 项目中的其他 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++ 源。什么给..?
这似乎是 Xcode4 中的一个主要错误,与编译器设置无关 - 只是 Xcode 内部。
更新:
我终于找到了根本原因。是的,这是 Xcode/LLVM 中的一个错误。它以错误的顺序编译文件,然后覆盖自己的设置,并破坏自身。苹果的技术支持太无能,甚至无法理解这个问题,所以我怀疑他们会很快修复这个错误。
(注意:跳过这一部分,请参阅下文,了解我原来的答案,它给出了一个暴力但非常快速的解决方案)
发生的情况是......如果编译器在处理C类时“看到”一个C++头......它就会将该头(内部)标记为“C”(即使这实际上是不可能的)。
后来,当它回到该标头,尝试用 C++ 编译它时,它发现它已经告诉自己标头是“C”(因为它非常愚蠢)......并立即崩溃。正确的解决方案(需要大量的时间和精力)是检查项目中的每个 C 文件,并检查(手动,因为 Xcode 很糟糕)对每个头文件的每个引用 - 并且对于每个头文件,每个它导入的头文件...等等
(这可能需要几个小时)
...直到您找到导致 C 文件“看到”C++ 标头的导入链。所有这些都应该是自动化的(但事实并非如此)。并且根本问题不应该发生(如果 Xcode 编写正确的话)。
我尝试了网络上其他地方列出的所有内容,大多数解决方案都是“不断删除/添加文件,如果幸运的话,最终 Xcode 会自行修复”。
转到项目的构建设置
我遇到了同样的错误,我只是将我的一个类(我称之为 box2d 类)从 className.m 重命名为 className.mm ,现在它可以工作了。
我在 Cocos2D/Box2D 项目中遇到了这个问题,直到我将项目中的所有
.mm
将它们编译为 Objective-C++ 后才解决。 .
我猜@Adam的解决方案也有效,但我更喜欢将编译设置保留为“根据文件类型”,感觉更干净。
实际上正确的解决方案是将您的代码放入:
#if __cplusplus
// … your code …
#endif // __cplusplus
从项目中删除 DebugDrawLayer 然后重新添加它解决了该问题。也许在构建阶段设置中的文件上有一些奇怪的编译器设置,从未检查过这些。
我在
Prefix.pch
时遇到了这个问题。我将
#import "Box2D.h"
更改为使用它的每个文件中。我遇到了同样的问题,我看了很多 youtube 视频并参考了很多论坛,所以我遇到的是
重新安装 clang