MacOS下C++游戏执行上下文错误致资源加载失败求助
MacOS下C++游戏可执行文件资源加载失败问题
使用工具
- JetBrains CLion IDE
- C++ 17
- CMake
- raylib库
问题背景
我开发了一个用于学习C++的小型游戏,使用相对路径加载纹理资源(路径相对于可执行文件),在Windows平台运行正常,但MacOS下出现平台相关问题:通过CLion启动游戏时所有资源加载成功,但直接运行编译生成的可执行文件时,所有资源均加载失败。
资源路径代码
#include <map> #include <string> std::map<std::string, const char *> assetsPaths{{"worldMap", "../assets/worldMap.png"}, {"knightIdle", "../assets/character/knight_idle_spritesheet.png"}, {"knightRun", "../assets/character/knight_run_spritesheet.png"}, {"goblinIdle", "../assets/enemy/goblin/goblin_idle_spritesheet.png"}, {"goblinRun", "../assets/enemy/goblin/goblin_run_spritesheet.png"}, {"rock", "../assets/obstacles/rock.png"}, {"log", "../assets/obstacles/log.png"}, {"sword", "../assets/weapon/sword/weapon_sword.png"}};
运行现象对比
IDE启动成功日志
INFO: FILEIO: [../assets/enemy/goblin/goblin_idle_spritesheet.png] File loaded successfully INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 3] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/enemy/goblin/goblin_run_spritesheet.png] File loaded successfully INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 4] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/character/knight_idle_spritesheet.png] File loaded successfully INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 5] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/character/knight_run_spritesheet.png] File loaded successfully INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 6] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/obstacles/log.png] File loaded successfully INFO: IMAGE: Data loaded successfully (27x16 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 7] Texture loaded successfully (27x16 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/obstacles/rock.png] File loaded successfully INFO: IMAGE: Data loaded successfully (22x21 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 8] Texture loaded successfully (22x21 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/weapon/sword/weapon_sword.png] File loaded successfully INFO: IMAGE: Data loaded successfully (16x16 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 9] Texture loaded successfully (16x16 | R8G8B8A8 | 1 mipmaps) INFO: FILEIO: [../assets/worldMap.png] File loaded successfully INFO: IMAGE: Data loaded successfully (768x768 | R8G8B8A8 | 1 mipmaps) INFO: TEXTURE: [ID 10] Texture loaded successfully (768x768 | R8G8B8A8 | 1 mipmaps)
直接运行可执行文件失败日志
WARNING: FILEIO: [../assets/enemy/goblin/goblin_idle_spritesheet.png] Failed to open file WARNING: FILEIO: [../assets/enemy/goblin/goblin_run_spritesheet.png] Failed to open file WARNING: FILEIO: [../assets/character/knight_idle_spritesheet.png] Failed to open file WARNING: FILEIO: [../assets/character/knight_run_spritesheet.png] Failed to open file WARNING: FILEIO: [../assets/obstacles/log.png] Failed to open file WARNING: FILEIO: [../assets/obstacles/rock.png] Failed to open file WARNING: FILEIO: [../assets/weapon/sword/weapon_sword.png] Failed to open file WARNING: FILEIO: [../assets/worldMap.png] Failed to open file
排查结果
测试发现使用绝对路径可正常加载资源,但不利于跨设备使用。调用GetWorkingDirectory()获取工作目录:
std::cout << "Run path: " << GetWorkingDirectory() << std::endl;
- IDE运行时工作目录:
/Users/nickrimer/cpp/classy_clash_game/cmake-build-debug - 直接运行可执行文件时工作目录:
/Users/nickrimer
可执行文件实际位于/Users/nickrimer/cpp/classy_clash_game/cmake-build-debug目录,但无论将可执行文件放在哪个文件夹,执行上下文始终指向用户根目录。
问题
如何让MacOS平台上的可执行文件以正确的执行上下文运行?如需更多构建信息,请告知。
内容的提问来源于stack exchange,提问作者Nick_Rimer
相关产品推荐
相关产品推荐

