C++ 使用SDL库的可执行文件的奇怪行为

C++ 使用SDL库的可执行文件的奇怪行为,c++,visual-studio,sdl,C++,Visual Studio,Sdl,我用SDL构建了一个太空入侵者克隆,并用MSVC11编译。代码加载4个单独的PNG文件和一个TTF字体以用于渲染。当给定一个绝对文件路径如“C:/spaceinvider.png”时,该程序工作得非常好 我尝试将其更改为相对文件路径,即“/res/spaceinvader.png” 然后在发布模式下编译程序,并将其放在自己的文件夹中 目录结构: game\game.exe game\(all the required SDL dlls) game\res\image1.png (and the

我用SDL构建了一个太空入侵者克隆,并用MSVC11编译。代码加载4个单独的PNG文件和一个TTF字体以用于渲染。当给定一个绝对文件路径如“C:/spaceinvider.png”时,该程序工作得非常好

我尝试将其更改为相对文件路径,即“/res/spaceinvader.png”

然后在发布模式下编译程序,并将其放在自己的文件夹中

目录结构:

game\game.exe
game\(all the required SDL dlls)
game\res\image1.png (and the other 3 images)
game\res\font.ttf
最奇怪的事情发生在您尝试运行游戏时。第一次尝试运行游戏时,程序控制台加载,SDL窗口打开,然后它崩溃到桌面上。(我已确保main()中没有过早返回代码)。但是,尽管其中一个精灵没有显示在屏幕上,但在随后的所有时间,程序都会加载并工作。控制台中出现的唯一错误与两个PNG文件的sRGB配置文件不正确有关

如果将整个文件夹移动到其他位置,程序第一次不会再次加载,但随后会加载

所以我的问题是

1) 为什么程序不是第一次加载,而是随后加载? 2) 当文件都相同(在photoshop中创建)并且加载它们的代码相同时,为什么只有一个精灵无法显示

(很抱歉没有在这里包含任何代码,因为我不认为这是一个编码问题-很高兴根据请求粘贴特定的代码段)

谢谢! K

编辑:

图像加载代码(loadTexture函数从:

此函数在main中调用:

if (Active_Gamestate.initialiseSprites(mainRenderer) != 0)
{
    return 1;  //quit game if sprites could not be initialised
}

谢谢你的帮助。我想我已经解决了问题。如果图像加载代码更改为以下内容:

char executablePath[FILENAME_MAX];

std::stringstream invaderpathstream;
invaderpathstream << executablePath << "/res/invader.png";
std::string invaderpath = invaderpathstream.str();

enemytexture = loadTexture(invaderpath, Renderer);
if (enemytexture == nullptr) 
     {return 1;}
char可执行路径[FILENAME_MAX];
std::stringstream入侵pathstream;

InvestorPathStream您应该做的第一件事是确保对所有可能失败的函数调用都有正确的错误处理。当您有错误处理时,他们(例如)会将消息打印到标准输出,然后尝试从命令行运行,看看会出现什么错误。如果没有帮助,请在调试文件夹中复制目录结构,然后在调试器中运行以捕获崩溃。如果这没有帮助,您很可能使用未初始化的变量(可能是指针),需要检查代码以找到这些位置。您的“第一次运行时崩溃,后续运行时工作”行为可能表示Windows容错堆正在采取操作并应用垫片(这可以解释为什么移动exe时会再次崩溃)-请参阅:-基本上,您的某个地方有一个严重的错误,但Windows会自动为您修补它。如果是这种情况,您需要查找FTH注册表项(在注册表中搜索您的exe名称)并删除它,然后使用调试器进行调试。如果您通过VS:FTH:(9556)启动,您还会在输出窗口中看到类似的内容:***容错堆填充已应用于当前进程。这通常是由于以前的崩溃造成的。***谢谢!我已添加了用于映像加载的代码。如果调用的所有SDL函数失败,将输出到std::cout。编译器在IDE调试器中运行时不会出现任何错误或警告,并且此行为仅在运行时发生独立的exe。@KK,这仍然是生成输出-您想在调试器中运行应用程序,然后在输出窗格中,确保它显示“显示输出自:调试”-您应该会看到许多关于加载DLL和符号的消息-这是FTH消息将出现的位置,如果有。
char executablePath[FILENAME_MAX];

std::stringstream invaderpathstream;
invaderpathstream << executablePath << "/res/invader.png";
std::string invaderpath = invaderpathstream.str();

enemytexture = loadTexture(invaderpath, Renderer);
if (enemytexture == nullptr) 
     {return 1;}