【问题标题】:How to add Box2d to an existing Xcode/Cocos2d Project如何将 Box2d 添加到现有的 Xcode/Cocos2d 项目中
【发布时间】:2013-03-02 20:43:46
【问题描述】:

我有一个工作 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 中我有一个项目 (MyProject) 和 2 个目标(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 应用程序。试图同时拥有这两者是一场彻头彻尾的噩梦。

【问题讨论】:

    标签: xcode cocos2d-iphone box2d box2d-iphone


    【解决方案1】:

    最简单的解决方案:开始一个已经集成了 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
    

    那么就很容易检查你的搜索路径是否正确。

    请务必将搜索路径添加到 标题搜索路径,而不是像其他库那样添加用户标题搜索路径设置。这是因为 Box2D 使用尖括号 &lt;file.h&gt; 包含。大多数其他库使用 "file.h" 代替,它们使用用户头搜索路径来查找它们的头文件。

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

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

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

    【讨论】:

    • 非常感谢您的帮助。我将在对原始问题的编辑中解释我目前的尝试,因为我仍然遇到同样的错误。
    • 我已经做了上面的编辑。您能否详细说明如何检查我的搜索路径是否正确?我不明白你回复的那部分。谢谢!
    • 减一级,因为 Box2D 已经在搜索路径中包含了 Box2D 文件夹,这使它最终对我有用!并且不要忘记将搜索路径放在“”之间,如果 Box2D 在您的项目文件夹中,“$(SRCROOT)”就可以了
    • 必须有更简单的方法来添加现有库。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多