由于可执行上下文不正确,程序看不到资产

问题描述 投票:0回答:1

我在 Mac 上编译程序时遇到了一个具体问题。至此,Windows 上的一切都很好。所以我确信问题不在代码内部,这只是平台问题。

我用的:

我当前的项目是一个非常小的游戏,我曾经开始学习C++,所以我使用了几个纹理来加载它们来创建精灵和背景。

#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

我知道问题出在阅读路径的某个地方。因此,当我尝试使用绝对路径来测试我的理论时,一切正常。但这很不方便,因为游戏在另一台机器上肯定无法运行。

我尝试了这行代码来了解发生了什么。

std::cout << "Run path: " << GetWorkingDirectory() << std::endl;

有结果了:

通过IDE运行:

Run path: /Users/nickrimer/cpp/classy_clash_game/cmake-build-debug

通过文件夹中的可执行文件运行:

Run path: /Users/nickrimer

我不知道为什么,但系统认为我正在根文件夹内运行,当然这条路径上没有资产。我确保我正在运行的文件位于此文件夹内:/Users/nickrimer/cpp/classy_clash_game/cmake-build-debug

实际上,这个可执行文件放置在哪个文件夹中并不重要,它的可执行上下文总是不正确的,并且总是引用根文件夹。

那么问题是如何在具有正确执行上下文的 MacOS 平台上运行可执行文件?

请告诉我是否需要向您提供有关此版本的更多必要信息。

c++ macos cmake clion raylib
1个回答
0
投票

我不知道以前怎么没有建议这样做,但是 Raylib 提供了一个解决方案:

// Get the directory of the running application (uses static string)
const char *GetApplicationDirectory(void);

此外,Raylib 还提供了获取和更改当前目录的功能,因此类似这样的操作应该可以加载您的资源:

prev_dir = GetWorkingDirectory();
app_dir  = GetApplicationDirectory();

ChangeDirectory(app_dir);
// load your assets
ChangeDirectory(prev_dir);
© www.soinside.com 2019 - 2024. All rights reserved.