Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Xcode 5c++;SDL应用程序未在XCode IDE外部加载_C++_Xcode_Macos_Sdl_Sdl 2 - Fatal编程技术网

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

C++ Xcode 5c++;SDL应用程序未在XCode IDE外部加载,c++,xcode,macos,sdl,sdl-2,C++,Xcode,Macos,Sdl,Sdl 2,在过去的一年里,我一直在编写一个游戏,我正在移植到Mac上 我已根据以下各项设置了所有内容:。我已经更改了一些步骤来补偿版本(5) 在我的代码中,我使用tinyXML在资产文件夹中加载.xml文件。这在windows和linux上非常有效,但是在Mac上我遇到了一些问题。这是一句话: Doc.LoadFile(DataPath); Doc是tinyxml2::XMLDocument类型,数据路径通常是“assets/Data.xml”,在maci中,该行硬编码为“DataPath” 当在IDE

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

我已根据以下各项设置了所有内容:。我已经更改了一些步骤来补偿版本(5)

在我的代码中,我使用tinyXML在资产文件夹中加载.xml文件。这在windows和linux上非常有效,但是在Mac上我遇到了一些问题。这是一句话:

Doc.LoadFile(DataPath);
Doc是tinyxml2::XMLDocument类型,数据路径通常是“assets/Data.xml”,在maci中,该行硬编码为“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
我找到基本路径+我需要的任何数据,并将.c_str()版本传递给tinyXML。如果我找到一个更好/更干净的版本,我一定会在这里更新它。

您的代码告诉您代码中正在崩溃的行号(
tinyxml2.cpp:745
)。至少,您的资产可能不在应用程序预期的位置,或者没有权限。检查您的
数据路径
,查看它尝试加载的位置应该可以让您开始

看起来你可能错误地认为你可以使用一个相对路径并获得相对于应用包的资产;你不能那样做


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

您是否正在尝试加载文件,并且不检查
NULL
指针返回?可能发生这种情况的原因是,在Xcode中运行程序时,当前目录可能是在Xcode外部运行程序的另一个目录。@JoachimPileborg pastebin代码段比当前版本稍旧。我还没有更新我的存储库。我确实检查了nullptr返回,在IDE中一切正常。如果是这样,那么如何将我的资产文件夹链接到我的应用程序文件?编辑:我在nullptr检查中添加了。拥有完整的崩溃报告(或至少是
异常类型
)和控制台输出会很有用。@BradAllred这是完整的崩溃报告:应用程序希望我的资产在哪里?我把它们放在应用程序启动程序旁边,它们是否应该在应用程序文件中?Tinyxml 2是一个免费的小API,可以在网上找到。由于无法加载assets文件夹,它试图访问不存在的元素。@creativeflow为什么问我你的应用程序希望你的资产在哪里?如前所述,您可以使用调试器检查
数据路径
变量,查看它试图从何处加载。我也在用一些有用的信息更新我的答案该死的,我应该查一些东西给我目录。非常感谢,它工作得很好。我已经在资源文件夹中有了数据,但如果不给出完整路径,就无法从代码中访问它。谢谢!如果我能投赞成票,我很高兴你能解决它。对于不熟悉应用程序捆绑包概念的人来说,这实际上是一个相当常见的问题。我很高兴你来到这里帮助我这个可怜的家伙!再次谢谢你。已经好几天了,有点睡眠不足;检查sdl库通常是我做的第一件事,但整个Mac的事情把我甩了。希望我的帖子能给未来的参与者带来一些帮助。
if(Doc.LoadFile("assets/Data.xml"))
{
    std::string path = (std::string)SDL_GetBasePath() + "assets/Data.xml";
    if(Doc.LoadFile(path.c_str()))
    {
        return false;
    }
}