调试C+中的加载时间错误+;在Win10上用VS2015编译的SDL2程序 我在C++中用Visual Studio 2015在64位Windows 10上用SDL2编写了一个项目。我最近购买了一台新的Windows10笔记本电脑,并从github克隆了我的项目。我的项目编译正确,但运行时出现以下错误:
应用程序无法正确启动(0xc000007b)。单击“确定”关闭应用程序 根据我到目前为止的研究,这个错误通常是由加载不兼容的DLL引起的,例如64位版本而不是32位版本。到目前为止,我发现的建议包括:调试C+中的加载时间错误+;在Win10上用VS2015编译的SDL2程序 我在C++中用Visual Studio 2015在64位Windows 10上用SDL2编写了一个项目。我最近购买了一台新的Windows10笔记本电脑,并从github克隆了我的项目。我的项目编译正确,但运行时出现以下错误:,c++,dll,visual-studio-2015,windows-10,sdl-2,C++,Dll,Visual Studio 2015,Windows 10,Sdl 2,应用程序无法正确启动(0xc000007b)。单击“确定”关闭应用程序 根据我到目前为止的研究,这个错误通常是由加载不兼容的DLL引起的,例如64位版本而不是32位版本。到目前为止,我发现的建议包括: 检查我是否正在使用32位版本的SDL2 DLL 安装/重新安装VisualStudio 2015
- 检查我是否正在使用32位版本的SDL2 DLL
在这一点上,像以前一样,依赖性Walker冻结了。我仍然完全不知所措,我觉得我还不能确定是什么导致了问题。请注意,Dependency Walker有32位和64位版本。如果应用程序是32位的,则应使用32位版本。否则依赖项遍历器将看到System32的libs,而不是SisWOW64。
您的图像显示32位和64位libs混合,其中64位有错误。这绝不是完全可靠的,但您可以尝试一下。它需要包含在Visual Studio中的dumpbin.exe 首先,获取程序的从属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)
C:\Windows\System32\kernel32.dll
8664机器(x64)
C:\programs\ed23\bin\hydra.dll
14C机器(x86)
请注意,这是错误地使用System32中的kernel32.dll,而不是WOW6432,因此它显示为x64。这是因为它只是使用了路径,而Windows加载程序实际上将使用WOW6432映射器、SxS和应用程序清单,并且只有在没有解决依赖关系的情况下才返回路径。它也找不到依赖项的依赖项(可以通过依赖项编写递归脚本,但一定要过滤掉重复项),当然也不知道任何关于运行时显式动态加载的信息
尽管如此,这是一个快速的方法,可以得到一个简短的列表来检查,并可能发现您的问题。我觉得自己非常愚蠢,但我最终找到了真正的问题所在。我使用的是SDL字体库SDL2_ttf,我只是没有将zlib.dll从SDL2_ttf lib目录复制到构建目录中。我不明白为什么错误信息如此神秘;过去,缺少dll给了我一条有用的“foo.dll缺少”错误消息
无论如何,谢谢大家的帮助。至少我学到了一个有用的教训:在怀疑更复杂的问题之前,始终确保所有必需的DLL都存在。Windows操作系统负责解决具有匹配名称的问题。可能发生的情况是,有一个您可能不知道的64位组件位于系统路径的目录中,而Windows恰好找到了该DLL并尝试加载它。这是有道理的。你知道有没有一个系统的方法让我来确定它是哪一个吗?Dependency Walker似乎太过时了,没有什么用处,当然,在我的路径中可以找到数百个DLL。在Dependency Walker中,单击C:\图标-它将告诉您从何处获取文件。您是否尝试过从64位cmd提示符(windows/system32中的提示符)和32位cmd提示符(windows/syswow64中的提示符)运行它。您是否真正达到了主功能?你在那台机器上安装了2015 redists吗?实际上,你的64位exe必须加载一个32位dll,将所有dll复制到与exe相同的目录中,并检查其是否工作,同时确认每个dll实际上是64位的。这确实是我的问题之一。我在我的32位可执行文件上使用了64位依赖项遍历程序。非常感谢。用新的输出更新我的问题。在Dependency Walker中验证“未运行”,如果存在一些64位库。如果所有的lib都是32位的,则很可能libs64是在延迟模式下动态加载的。确保项目使用的所有库(libfreetype-6、libpng16-16、SDL2、SDL2_映像、SDL2_混频器和SDL2_ttf…)都是32位编译的。这非常有用!这项技术表明Windows正在System32中查找64位版本的msvcp140d.dll、vcruntime140d.dll、UCRTBASE.dll和kernel32.dll。是否有一些Visual Studio项目设置可以更改,以使Windows在SysWoW64中显示32位版本?这也是我的问题!这已经困扰了我一个多月了。显然我