所以我想在我的cocos2d + box2d项目中公开公开一个指向其他Objective-C ++类的Box2D(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 ++ source。什么给...?
答案 0 :(得分:19)
这似乎是Xcode4中的一个主要错误,与编译器设置无关 - 只是Xcode内部。
更新:
我最终找到了根本原因。是的,这是Xcode / LLVM中的一个错误。它以错误的顺序编译文件,然后覆盖它自己的设置,并打破自己。 Apple的技术支持太难以理解问题了,所以我怀疑他们很快就会修复这个bug。
(注意:跳过这一部分,见下文,我的原始答案,给出了一个强大的力量但非常快速的解决方案)
如果编译器在处理 C类时“看到”C ++标题,那么会发生什么......然后它将标题(内部)标记为“C”(即使这是字面上不可能)。
稍后,当它回到那个标题时,试图用C ++编译它,它发现它已经告诉自己标题是“C”(因为它非常愚蠢)......并且立即崩溃。 / p>
正确的解决方案(需要大量的时间和精力)是通过项目中的每个C文件,并检查(手动,因为Xcode糟透了)每个引用到每个头文件 - 并且,对于每一个,它导入的每个头文件......等等。
(这可能需要数小时)
...直到找到导致C文件“看到”C ++标题的导入链。
所有这一切都应该是自动的(但不是)。并且根本问题不应该发生(如果Xcode被正确写入)。
我尝试了网上其他地方列出的所有内容,大多数解决方案都是“继续删除/添加文件,如果你很幸运,最终Xcode会自行修复”。
我不幸运。唯一有效的是:
实际的名称/值是:“GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp” - 所以我的猜测是,这会避开Xcode(破坏!)的内部逻辑。
答案 1 :(得分:3)
我有同样的错误,我只是将我的一个类(从中调用我的box2d类)重命名为className.m到className.mm,现在它可以工作了。
答案 2 :(得分:0)
从项目中删除DebugDrawLayer然后再次重新添加它解决了这个问题。也许在构建阶段设置中文件上有一些奇怪的编译器设置,从未检查过。
答案 3 :(得分:0)
我在Cocos2D / Box2D项目中遇到此问题,直到我将项目中的所有.m
文件(当然不包括Cocos2D中的文件)重命名为.mm
时才解决将它们编译为Objective-C ++。
我猜@ Adam的解决方案也有效,但我更喜欢将编辑设置保留为“根据文件类型”,感觉更清洁。
答案 4 :(得分:0)
实际上正确的解决方案是将您的代码放入:
#if __cplusplus
// … your code …
#endif // __cplusplus
答案 5 :(得分:0)
#import "Box2D.h"
中有Prefix.pch
时遇到此问题。我将#import "Box2D.h"
更改为使用它的每个文件。