5

我有一个工作 Xcode 项目,其中一个视图中包含 Cocos2d。我现在需要添加 Box2d。我尝试将 Box2D 文件夹拖到我的 cocos2d-2.x-ARC-iOS 文件夹的 libs 目录中并添加到该目标,但我在编译时得到了这个:

(in b2BroadPhase.cpp)
'Box2D/Collision/b2BroadPhase.h' file not found

我确信这只是我会遇到的许多错误中的第一个。为了在我的项目中编译所有 Box2d 文件,我缺少什么步骤?

所有 box2d 文件都列在 cocos2d-library 目标的编译源中。

为什么这很难做到?为什么它不像其他图书馆那样工作?

并且 - 我是否必须将项目中的每个 .m 重命名为 .mm?这几乎是不可能的,因为这是一个包含许多文件的大型 xcode 项目。我只是想在一个视图中使用 Box2d。


针对LearnCocos2D给出的答案的附加信息-

我的文件夹结构(在 Finder 中)如下所示:

Root = MyProject.xcodeproj,MyProject 文件夹,cocos2d-2.x-ARC-iOS 文件夹在cocos2d-2.x-ARC-iOS 文件夹中有一个名为libs 的文件夹。在该文件夹中,我有 Box2D 文件夹,以及 Cocos2d、CocosDenshion 等。

在 XCode 中,我有一个 PROJECT (MyProject) 和 2 个 TARGETS (cocos2d-library, MyProject) PROJECT 和 TARGETS 都有“标题搜索路径”。我设置哪一个?它应该是递归的还是非递归的?当我将 Box2D 文件夹拖到 Xcode 中时,我将它设置为哪个目标?

我的项目文件位于 /Users/me/Dropbox/iOS/MyProject。那么我究竟为标题搜索路径输入了什么?/Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs 似乎不起作用。


另一个更新 - /Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs 作为 MyProject TARGET 中的标题搜索路径似乎让我摆脱了 Box2D 错误。然后我有一个'cassert'文件未找到错误。通过将视图控制器、它的父级和 AppDelegate 更改为您建议的“Objective-C++ Source”文件类型来解决这个问题。现在...

现在我在 NSObjCRuntime.h NSZone.h、NSObject 中遇到了一系列错误(预期的不合格 ID、未知类型名称“NSString”等)。所以看起来你要么使用 Box2d/Cocos2d 创建一个应用程序,要么创建一个 UIKit 应用程序。试图两者兼得是一场彻头彻尾的噩梦。

4

3 回答 3

8

最简单的解决方案:开始一个已经集成了 Box2D 的新项目。然后将您的源文件和资源添加到其中。相信我,它不会变得更容易。

我想到了 Box2D 需要的几件事:

作为搜索路径,使用 Box2D.h 文件的路径减去一级。好的,这需要一个更好的解释:

如果 Box2D.h 在/Projects/MyProject/libs/Box2D

...那么搜索路径应该是/Projects/MyProject/libs

这是因为 Box2D #include 语句总是包含 Box2D 路径:

#include <Box2D/Common/b2Settings.h>

总之,标题搜索路径加上#include/#import 路径应该给出文件的完整路径:

/Projects/MyProject/libs/Box2D/Common/b2Settings.h

然后很容易检查您的搜索路径是否正确。

确保将搜索路径添加到Header Search Path而不是 User Header Search Path 设置,就像其他库一样。这是因为 Box2D 使用尖括号<file.h>包含。大多数其他库都使用"file.h",它们使用用户头文件搜索路径来查找他们的头文件。

为什么难?编译器设置。他们有很多。错误和警告并不总是显而易见的。其实,这是常态。还有很多编写和添加代码的方法。哦,还有这么多不同的语言和语言版本。这主要是经验问题。5级以上就容易多了,10级就麻烦了。:)

您必须直接(#import "Box2D.h")或间接(包括包含 Box2D 的标头)重命名每个包含 Box2D 的 .m 文件。如果您将 Box2D 标头添加到 Prefix.pch 文件,这与将其包含在每个文件中是一样的 - 所以在您的情况下我不会这样做。

您可以通过将 Xcode 中 .m 文件的文件类型设置为“Objective-C++”来避免重命名。尽管这将同样乏味,如果不是更多的话。提示:对于像这样的情况,有大量重命名文件的好工具。

于 2013-03-02T23:43:18.743 回答
2

将此添加到标题搜索路径并查看神奇的工作: $[PROJECT_DIR]

于 2014-06-09T20:27:17.937 回答
1

您可能会遇到以下编译错误:

  1. “未找到头文件”:解决方法是修改用户头文件搜索路径以包含 Box2D 的目录。如果将 Box2D 放在项目目录下,则可以使用以下环境变量 ${PROJECT_DIR}。记得检查“递归”。注意:从标题路径中删除所有到 Box2D 的链接。例如:TestGame/Libraries/Box2D -> ${PROJECT_DIR}/TestGame/Libraries

  2. 找不到 Cpp 头文件,例如<cassert>...:将文件重命名为扩展名 *.mm 而不是 *.m 将解决此问题。

于 2015-06-27T03:05:15.590 回答