Xcode 5 C++SDL应用程序未在Xcode IDE外部加载
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加载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目录中的应用程序捆绑包中?
- C++:如何在CLion IDE中安装Boost
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- IDE (CLion) 无法解析C++模板类型
- Xcode 语义问题引用或以前定义的代码
- 使用 Xcode 将双精度存储在数组C++中
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 为什么联机C++ IDE 不支持"graphics.h"头文件?
- Qt - 从XCode上传到MacOS AppStore
- LLVM 3.8:使用AD IDE(XCODE)实现通行证
- 使用 Xcode 作为 C++ 代码的 IDE
- 为什么他的语法正确的程序不能在带有llvm编译器的Xcode IDE上编译?
- Xcode 6 的 Playground 功能适用于 Visual Studio 或其他使用 C++ 的 IDE?
- Xcode 5 C++SDL应用程序未在Xcode IDE外部加载
- 如何使用XCode IDE在SFML中通过相对路径加载图像
- 浮点常量值因C++声明方式而异(Xcode IDE)
- 在Xcode IDE中初始化我自己的c++类向量