如何将Box2d添加到现有的Xcode/Cocos2d项目中

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目标的Compile Sources中。
为什么这样做很困难?为什么它不像其他库那样工作?
并且-我是否必须将我的项目中的每个.m重命名为.mm?这几乎是不可能的,因为这是一个包含许多文件的大型XCode项目。我只是想在一个视图中使用Box2d。
针对LearnCocos2D的答案给出的额外信息-
我的文件夹结构(在Finder中)如下:
根目录= MyProject.xcodeproj,MyProject文件夹,cocos2d-2.x-ARC-iOS文件夹 在cocos2d-2.x-ARC-iOS文件夹中,有一个名为libs的文件夹。里面有Box2D文件夹,以及Cocos2d,CocosDenshion等。
在XCode中,我有一个PROJECT(MyProject) 和两个TARGETS(cocos2d-library,MyProject) 对于PROJECT和TARGETS,都有“Header Search Paths”。我应该设置哪一个?它应该是递归还是非递归?当我将Box2D文件夹拖入XCode时,我应该将其设置为哪个目标?
我的项目文件位于/Users/me/Dropbox/iOS/MyProject。那么我为Header Search Path输入什么?/Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs似乎不起作用。
另一个更新-/Users/me/Dropbox/iOS/MyProject/cocos2d-2.x-ARC-iOS/libs作为MyProject TARGET中的Header Search Path似乎让我克服了Box2D错误。然后,我遇到了“cassert”文件未找到的错误。通过像您建议的更改视图控制器、它的父级和AppDelegate为“Objective-C++ Source”文件类型来解决它。现在…
现在我有一堆NSObjCRuntime.h NSZone.h、NSObject(预期未限定ID,未知类型名称'NSString'等)的错误。因此,看来您要么创建一个具有Box2d/Cocos2d的应用程序,要么创建一个具有UIKit应用程序。试图同时拥有两者是一场完全的噩梦。
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”代替,它们使用用户头文件搜索路径来查找头文件。
为什么会很困难呢?编译器设置。有很多设置。错误和警告并不总是显而易见。实际上,这是正常情况。而且有很多编写和添加代码的方式。还有很多不同的语言和语言版本。这主要是经验问题。在5级及以上,它变得更容易,在10级时只是个麻烦。 :)
你必须重命名所有直接(#import "Box2D.h")或间接(包括一个包含Box2D的头文件)包含Box2D的.m文件。如果将Box2D头文件添加到Prefix.pch文件中,这与在每个文件中都包含它是一样的,所以在你的情况下我不会这样做。
你可以通过将Xcode中.m文件的文件类型设置为“Objective-C ++”来避免重命名。虽然这也同样繁琐,甚至更加繁琐。提示:有很好的工具可用于批量重命名文件,用于这种情况。

非常感谢您的帮助。我将在原问题的编辑中解释我目前的尝试,因为我仍然遇到相同的错误。 - soleil
我已经进行了上述编辑。您能否详细说明如何检查我的搜索路径是否正确?我没有理解您回复中的那部分内容。谢谢! - soleil
1
减少一级目录,因为Box2D已经包含在搜索路径中,这是让它最终对我起作用的原因!而且不要忘记将搜索路径放在""之间,就像如果Box2D在您的项目文件夹中,"$(SRCROOT)"就可以解决问题。 - Nicolas Manzini
必须有更简单的方法来添加现有库。 - jeet.chanchawat

2
将以下内容添加到头文件搜索路径中,即可让魔法生效: $[PROJECT_DIR]

1
您可能会遇到以下编译错误:
  1. "找不到头文件":解决方案是修改用户头文件搜索路径,将Box2D的目录包含在内。如果您将Box2D放在项目目录下面,可以使用以下环境变量${PROJECT_DIR}。记得勾选“递归”。注意:从头文件路径中删除所有与Box2D相关的链接。例如:TestGame/Libraries/Box2D -> ${PROJECT_DIR}/TestGame/Libraries

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接