Xcode 5 C++SDL应用程序未在Xcode IDE外部加载

Xcode 5 C++ SDL app not loading outside of XCode IDE

本文关键字:Xcode IDE 外部 加载 C++SDL 应用程序      更新时间:2023-10-16

在过去的一年里,我一直在编写一款游戏,我正在移植到Mac。

我根据以下内容设置了所有内容:http://blog.davidecoppola.com/2013/08/22/how-to-set-up-a-sdl-2-project-for-os-x-in-xcode-4/.我已经更改了一些步骤来补偿版本(5)。

在我的代码中,我使用tinyXML加载assets文件夹中的.xml文件。这在windows和linux上运行得很好,但是在Mac上我遇到了一些问题。这是一条线:

Doc.LoadFile(DataPath);

Doc是一个tinyxml2::XMLDocument类型,DataPath通常是"assets/Data.xml",在Mac中,我将该行硬编码到"DataPath"的位置。

当在IDE中运行代码时,我没有遇到任何问题,我的游戏会像在所有其他平台上一样运行,但当运行.app文件(位于gameMac/Build/Products/Debug中)时,它在启动后立即崩溃。"资源"文件夹也位于此位置。

以下是Mac在崩溃后向我抛出的错误:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   gameMac                        0x000c1525 tinyxml2::XMLNode::FirstChildElement(char const*) const + 21
1   gameMac                        0x000d1954 tinyxml2::XMLNode::FirstChildElement(char const*) + 36
2   gameMac                        0x000d04d5 DataLoader::load(char const*, ID_Data, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) + 197
3   gameMac                        0x000a5849 MapHandler::MapHandler(std::__1::shared_ptr<gameData>) + 1177
4   gameMac                        0x000a539e MapHandler::MapHandler(std::__1::shared_ptr<gameData>) + 30
5   gameMac                        0x000b7eb8 splay::splay(std::__1::shared_ptr<gameData>) + 1592
6   gameMac                        0x000b786e splay::splay(std::__1::shared_ptr<gameData>) + 30
7   gameMac                        0x000ee3f9 std::__1::shared_ptr<splay> std::__1::shared_ptr<splay>::make_shared<std::__1::shared_ptr<gameData>&>(std::__1::shared_ptr<gameData>&&&) + 1849
8   gameMac                        0x000ebc7c stateHandlerGen::stateHandlerGen(std::__1::shared_ptr<gameData>) + 236
9   gameMac                        0x000ebb7e stateHandlerGen::stateHandlerGen(std::__1::shared_ptr<gameData>) + 30
10  gameMac                        0x000e7a89 game::init(char const*, int, int, int, int, bool) + 1545
11  gameMac                        0x000be8c4 main + 516
12  libdyld.dylib                       0x91b3c725 start + 1

(请注意,gameMac不是我项目的名称,由于保密协议,我已经更改了细节)。

正如我在这里所指出的,加载我的数据DataLoader::load(params)的相同方法会导致崩溃。这让我相信我的资产文件夹没有加载到.app文件中。

通过这一点,我试图编辑一个构建阶段,Copy Bundle Resources,这并没有改变问题。然后,我尝试创建一个新建阶段Copy Files并将其设置为Resources,但也失败了。然后,我通过将Copy Files设置为Product Directory来进行实验;这将assets文件夹复制到了build文件夹,但.app文件仍然无法加载到assets中。

我错过什么了吗?一些XCode兽医能帮我吗?过去几天我一直在尝试解决这个问题。谢谢

http://pastebin.com/Xq4Hxh4d(这是我的DataLoader的顶部,如上所述。EDIT:在我检查nullptr返回时添加了,是的,如果失败,它将返回true)。

p.S我只能给出我的代码片段,我已经给出了我认为最有可能的问题,资源加载:)

完整的事故报告在下面的评论中。

修复,感谢Brad Allred的帮助:

资源位于.app文件中,特别是{Application}/Contents/resources;在我的情况下,我想访问资产中的一个文件。我做了一个构建阶段,将数据复制到resources文件夹,使我的目录{Application}/Contents/resources/Assets/../。使用SDL_GetBasePath,我可以创建一个字符串,它是从基本目录到Resources文件夹的绝对路径。

这是代码:

if(Doc.LoadFile("assets/Data.xml"))
{
    std::string path = (std::string)SDL_GetBasePath() + "assets/Data.xml";
    if(Doc.LoadFile(path.c_str()))
    {
        return false;
    }
}

我插入基本路径+我需要的任何数据,并将.c_str()版本传递给tinyXML。如果我找到一个更好/更干净的版本,我一定会在这里更新它。

您的崩溃报告告诉您代码中崩溃的行号(tinyxml2.cpp:745)。at可能你的资产没有在应用程序预期的位置,或者没有权限。检查您的DataPath,看看它试图加载到什么位置应该让您开始。

似乎你错误地认为你可以使用相对路径并获得与应用程序捆绑包相关的资产;你不能那样做。

既然您正在使用SDL,为什么不使用SDL API(请参阅SDL_GetBasePath)获取资源路径,以便您可以将资产正确存储在Resources目录中的应用程序捆绑包中?