[英]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.