在Win10上用VS2015编译的C++ SDL2程序调试加载时间错误

Debugging load time error in C++ SDL2 program compiled with VS2015 on Win10

我正在使用 Visual Studio 2015 在 64 位 Windows 10 上使用 SDL2 在 C++ 中编写一个项目。我最近购买了一台新的 Windows 10 笔记本电脑并从中克隆了我的项目github。我的项目编译正确,但是当我 运行 它时出现以下错误:

The application was unable to start correctly (0xc000007b). Click OK to close the application.

根据我目前的研究,这个错误通常是由加载不兼容的 DLL 引起的,例如64 位版本而不是 32 位版本。目前我发现的建议包括:

我的项目设置为为 Win32 构建,并且我确保我使用的是我明确链接的所有 DLL 的 32 位版本(libfreetype-6、libpng16-16、SDL2、SDL2_image、SDL2_mixer 和 SDL2_ttf)。我已经确认我的机器上安装了 x86 VC++ Redistributable。

最后,我尝试使用 Dependency Walker 来确定可能导致问题的 DLL(尽管我已经阅读了 Dependency Walker 有很多误报的警告)。这些是结果:

Dependency Walker 静态分析

Dependency Walker 分析结果

在那之后,探查器会冻结并且永远不会继续。请注意,SDL 组件和 VC 运行 时间加载没有错误。

程序在我的两台旧机器上正确编译和加载,一台 运行ning 32 位 Windows 7 和一台 运行ning 64 位 Windows 10 .

现在开始真正的问题。我还可以采取哪些其他步骤来调试此崩溃?或者有人从我提供的信息中看出我做错了什么吗?

相关问题:

编辑:

正如 rflobao 所建议的,我在 32 位 exe 上使用 64 位版本的 Dependency Walker。这是我的分析的新输出 运行:

此时,和以前一样,Dependency Walker 冻结了。我仍然完全迷失了方向,感觉自己离确定问题的原因还差得很远。

请注意,Dependency Walker 有 32 位和 64 位版本。如果您的应用程序是 32 位的,您应该使用 32 位版本。否则 Dependency Walker 将看到 System32 而不是 SisWOW64 的库。 您的图像显示混合了 32 位和 64 位库,其中 64 位有错误。

这绝不是完全可靠的,但你可以试一试。它需要 dumpbin.exe,它包含在 Visual Studio.

首先,获取程序的依赖 DLL 列表,根据您的路径解析:

del dlls.txt
for /f %d in ('dumpbin /dependents Questless.exe ^| findstr /ic:".dll"') do @echo %~$PATH:d >> dlls.txt

然后获取每个的位数:

for /f "delims=" %d in (dlls.txt) do @echo %d & dumpbin /headers "%d" | findstr /c:"machine (x"

这将产生如下输出:

C:\Windows\System32\kernel32.dll
            8664 machine (x64)
C:\programs\ed23\bin\hydra.dll
             14C machine (x86)

请注意,这是错误地使用了 System32 中的 kernel32.dll,而不是 WOW6432 中的 kernel32.dll,因此它显示为 x64。那是因为它只是使用了路径,当 Windows 加载器实际使用 WOW6432 映射器、SxS、应用程序清单时,只有在其中 none 解决了依赖关系时才回退到路径上。它也找不到依赖项的依赖项(您可以编写脚本通过依赖项递归,但一定要过滤掉重复项),当然对 运行 时间显式动态加载一无所知。

尽管如此,这是获取要检查的简短列表的快速方法,并且可能会发现您的问题。

我觉得自己很笨,但我终于找到了真正的问题所在。我正在使用 SDL 字体库 SDL2_ttf,而我只是没有将 zlib.dll 从 SDL2_ttf lib 目录复制到我的构建目录中。我不明白为什么错误信息如此神秘;在过去,丢失的 DLL 给了我一个有用的 "foo.dll is missing" 错误消息。

无论如何,谢谢大家的帮助。至少我学到了一个有用的教训:在怀疑更复杂的问题之前,始终确保所有必需的 DLL 都存在。