Objective-C ++导入C ++类失败,找不到cassert

时间:2012-08-21 07:07:08

标签: objective-c ios cocos2d-iphone objective-c++ box2d-iphone

所以我想在我的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。什么给...?

6 个答案:

答案 0 :(得分:19)

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


更新:

我最终找到了根本原因。是的,这是Xcode / LLVM中的一个错误。它以错误的顺序编译文件,然后覆盖它自己的设置,并打破自己。 Apple的技术支持太难以理解问题了,所以我怀疑他们很快就会修复这个bug。

(注意:跳过这一部分,见下文,我的原始答案,给出了一个强大的力量但非常快速的解决方案)

如果编译器在处理 C类时“看到”C ++标题,那么会发生什么......然后它将标题(内部)标记为“C”(即使这是字面上不可能)。

稍后,当它回到那个标题时,试图用C ++编译它,它发现它已经告诉自己标题是“C”(因为它非常愚蠢)......并且立即崩溃。 / p>

正确的解决方案(需要大量的时间和精力)是通过项目中的每个C文件,并检查(手动,因为Xcode糟透了)每个引用到每个头文件 - 并且,对于每一个,它导入的每个头文件......等等。

(这可能需要数小时)

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

所有这一切都应该是自动的(但不是)。并且根本问题不应该发生(如果Xcode被正确写入)。


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

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

  1. 转到构建项目设置
  2. 找到“编译源代码”设置
  3. 将其设为“Objective-C ++”
  4. 重新构建
  5. 实际的名称/值是:“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"更改为使用它的每个文件。