因此,我想公开公开一个 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 文件开始的。
Update:
日志显示 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 内部。
UPDATE:
我最终找到了根本原因。是的,这是 Xcode/LLVM 中的一个错误。它以错误的顺序编译文件,然后覆盖自己的设置,并破坏自身。苹果的技术支持太无能,甚至无法理解这个问题,所以我怀疑他们会很快修复这个错误。
(注意:跳过这一部分,请参阅下面的我原来的答案,它给出了一个暴力但非常快速的解决方案)
发生的情况是……如果编译器“看到”C++ 头文件处理时C 类...然后它将该标头(内部)标记为“C”(即使这实际上是不可能的)。
后来,当它回到那个头文件,尝试用 C++ 编译它时,它发现它已经告诉自己头文件是“C”(因为它非常愚蠢)......并立即崩溃。
The correct解决方案(需要大量的时间和精力)是检查项目中的每个 C 文件,并检查(手动,因为 Xcode 很糟糕)对每个头文件的每个引用 - 并且对于每个头文件,它导入的每个头文件。 .. ETC。
(这可能需要几个小时)
...直到找到导致 C 文件“看到”C++ 标头的导入链。
所有这些都应该是自动化的(但事实并非如此)。并且根本问题不应该发生(如果 Xcode 编写正确的话)。
我尝试了网络上其他地方列出的所有内容,大多数解决方案都是“不断删除/添加文件,如果幸运的话,最终 Xcode 会自行修复”。
我并不幸运。唯一有效的是:
- 转到项目的构建设置
- 找到“将源编译为”设置
- 将其设置为“Objective-C++”
- re-build
实际的名称/值是:“GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp” - 所以我的猜测是这回避了 Xcode 的(损坏的!)内部逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)