Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调试C+中的加载时间错误+;在Win10上用VS2015编译的SDL2程序 我在C++中用Visual Studio 2015在64位Windows 10上用SDL2编写了一个项目。我最近购买了一台新的Windows10笔记本电脑,并从github克隆了我的项目。我的项目编译正确,但运行时出现以下错误:_C++_Dll_Visual Studio 2015_Windows 10_Sdl 2 - Fatal编程技术网

调试C+中的加载时间错误+;在Win10上用VS2015编译的SDL2程序 我在C++中用Visual Studio 2015在64位Windows 10上用SDL2编写了一个项目。我最近购买了一台新的Windows10笔记本电脑,并从github克隆了我的项目。我的项目编译正确,但运行时出现以下错误:

调试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

应用程序无法正确启动(0xc000007b)。单击“确定”关闭应用程序

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

  • 检查我是否正在使用32位版本的SDL2 DLL
  • 安装/重新安装VisualStudio 2015 用于排除哪个DLL出现故障
我的项目设置为针对Win32构建,并且我已确保使用所有显式链接的DLL的32位版本(libfreetype-6、libpng16-16、SDL2、SDL2_-image、SDL2_-mixer和SDL2_-ttf)。我已经确认我的机器上安装了x86 VC++可再发行版本

最后,我尝试使用Dependency Walker来确定是什么DLL导致了这个问题(尽管我读过一些警告,Dependency Walker有很多误报)。结果如下:

依赖关系分析

依赖项分析结果

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

该程序在我的两台旧计算机上正确编译和加载,一台运行32位Windows 7,另一台运行64位Windows 10

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

相关问题:

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


在这一点上,像以前一样,依赖性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位版本?这也是我的问题!这已经困扰了我一个多月了。显然我