[英]Xcode 5 C++ SDL app not loading outside of XCode IDE
在过去的一年中,我一直在编写游戏,目前正在移植到Mac。
我已经根据以下内容设置了所有内容: http : //blog.davidecoppola.com/2013/08/22/how-to-set-up-a-sdl-2-project-for-os-x-in-xcode -4 / 。 我已经更改了一些步骤以补偿版本(5)。
在我的代码中,我使用tinyXML在资源文件夹中加载.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不是我的项目的名称,由于NDA,我已经更改了该细节)。
正如我在这里指出的,加载我的数据DataLoader::load(params)
的相同方法正在崩溃。 这使我相信我的资产文件夹未加载到我的.app文件中。
通过此操作,我尝试编辑“构建阶段”,“ Copy Bundle Resources
并没有解决问题。 然后,我尝试制作一个新的构建阶段Copy Files
,并将其设置为Resources
,这也失败了。 然后,我通过设置“ Copy Files
到Product Directory
进行了实验; 这会将资产文件夹复制到构建文件夹,但是.app文件仍然不会加载到资产中。
我错过了什么? 某些XCode兽医可以在这里帮助我吗,过去几天我一直在尝试解决此问题。 谢谢。
http://pastebin.com/Xq4Hxh4d (如上所述,这是我的DataLoader的顶部。编辑:在我的检查中添加了nullptr返回,是的,如果失败,则返回true)。
PS我只能给出我的代码片段,我给出了我认为最有可能的问题,资源加载:)
完整的崩溃报告在下面的评论中。
该修复程序要感谢Brad Allred的帮助:
资源位于.app文件中,尤其是{Application} / Contents / 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
)。 在可能您的资产不在应用程序期望的位置或没有权限。 检查您的DataPath
以了解尝试将其加载到何处。
似乎您可能错误地假设您可以使用相对路径来获取相对于应用程序包的资产; 你不能那样做。
由于您使用SDL,为什么不使用SDL API(见SDL_GetBasePath )来获取资源的路径,这样就可以正确地存储在资源目录中的应用程序包内的资产?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.