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

问题描述 投票:0回答:7

所以我想公开公开一个 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++ 源。什么给..?

objective-c ios cocos2d-iphone objective-c++ box2d-iphone
7个回答
20
投票

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


更新:

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

(注意:跳过这一部分,请参阅下文,了解我原来的答案,它给出了一个暴力但非常快速的解决方案)

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

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

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

(这可能需要几个小时)

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

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

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


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

转到项目的构建设置

    找到“将源编译为”设置
  1. 将其设置为“Objective-C++”
  2. 重建
  3. 实际的名称/值是:“GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp” - 所以我的猜测是这回避了 Xcode 的(损坏!)内部逻辑。

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

3
投票

我在 Cocos2D/Box2D 项目中遇到了这个问题,直到我将项目中的所有

1
投票
文件(当然不包括 Cocos2D 中的文件)重命名为

.mm

 将它们编译为 Objective-C++ 后才解决。 .
我猜@Adam的解决方案也有效,但我更喜欢将编译设置保留为“根据文件类型”,感觉更干净。

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

1
投票
#if __cplusplus // … your code … #endif // __cplusplus

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

0
投票

我在

0
投票
中使用

Prefix.pch

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

我遇到了同样的问题,我看了很多 youtube 视频并参考了很多论坛,所以我遇到的是

0
投票

重新安装 clang

    打开终端运行命令
  1. /Library/Developer/CommandLineTools/SDKs/MacOSX15.0.sdk/usr/include
  2. 您可以通过运行
  3. cpp -v 命令来获取此路径 在上面的路径中添加文件夹bits
  4. 在bits文件夹中添加一个文件stdc++.h
  5. 从此处复制stdc++.h的内容
  6. https://github.com/tekfyl/bits-stdc-.h-for-mac
  7. 并将其粘贴到您的stdc++.h文件中 希望这能解决问题

© www.soinside.com 2019 - 2024. All rights reserved.