当前位置: 首页 > 知识库问答 >
问题:

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

何骞尧
2023-03-14

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

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

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

  • 检查是否正在使用32位版本的SDL2 DLL
  • 安装/重新安装Visual Studio 2015可再发行版的x86版本Visual C
  • 使用Dependency Walker排除哪个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位视窗7,一台运行64位视窗10。

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

相关问题:

  • 应用程序无法正确启动(0xc000007b)
  • Win 7、64位、dll问题
  • 在Visual studio 2010中使用SDL_映像时出现错误“应用程序无法正确启动0xc000007b”

正如rfobao所建议的,我在32位exe上使用了64位版本的依赖沃克。以下是我分析运行的新输出:

在这一点上,像以前一样,依赖性Walker冻结了。我仍然完全不知所措,我觉得我离确定问题的原因还有一段距离。

共有3个答案

周奇
2023-03-14

我觉得自己哑口无言,但我终于明白了真正的问题所在。我使用的是SDL字体库SDL2_ttf,我根本没有复制zlib。从SDL2_ttf lib目录到我的构建目录的dll。我不明白为什么错误信息如此神秘;过去,缺少dll给了我一条有用的“foo.dll缺少”错误消息。

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

宇文和同
2023-03-14

这决不是完全可靠的,但你可以试试看。它需要垃圾桶。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,因此它显示为x64。这是因为它只是使用了路径,而Windows加载程序实际上将使用WOW6432映射器、SxS、应用程序清单,并且只有当这些都没有解决依赖关系时才会回到路径上。它也找不到依赖项的依赖项(您可以通过依赖项进行脚本递归,但一定要过滤掉重复项),当然也不知道运行时显式动态负载。

尽管如此,这是一种快速获取短列表以进行检查的方法,可能会发现您的问题。

方奕
2023-03-14

请注意,Dependency Walker有32位和64位版本。如果应用程序是32位的,则应使用32位版本。否则依赖项遍历器将看到System32的libs,而不是SisWOW64。图像显示32位和64位libs混合,其中64位有错误。

 类似资料:
  • 本文向大家介绍win10环境下C++ vs2015编译opencv249的教程,包括了win10环境下C++ vs2015编译opencv249的教程的使用技巧和注意事项,需要的朋友参考一下 打开CMake,设置源文件路径,和生成路径,第一步我新建的build和buildwin32 我之前用过了,所以这里我另外建了一个文件夹 test来演示。 然后点击Configure,会出现编译器的选项,Vis

  • 我正在Eclipse Luna中使用Java1.8尝试Spark编程示例,并有以下代码- 我使用M2Eclipse构建和创建jar,并使用spark-submit在本地执行jar。jar正在工作并打印正确的输出,但是Eclipse总是将上面提到的行显示为编译错误-参数化 我不明白为什么Eclipse将其显示为编译错误,因为collect调用的返回类型是 非常感谢任何帮助。

  • 我是Java编程的新手,我正在自学。 在运行javac时遇到一些问题后,我再次检查了windows地址和类路径,并将它们设置为正确的目录路径。问题解决了,因为现在当我输入'javac-version'时,我得到的版本显示java comilier已经安装。因此,现在我正试图从命令提示符运行一个Helloworld程序,以便检查基本功能!(我没有使用Eclipse,因为我还没有准备好增加额外的复杂性

  • 主要内容:1) 创建项目(Project),2) 添加源文件,3) 编写代码并生成程序,4) 总结前面我们给出了一段完整的C语言代码,就是在显示器上输出“小牛知识库”,如下所示: 本节我们就来看看如何通过 VS2015 来运行这段代码。   1) 创建项目(Project) 在 VS2015 下开发程序首先要创建项目,不同类型的程序对应不同类型的项目,初学者应该从控制台程序学起。 打开 VS2015,在上方菜单栏中选择“文件 --> 新建 --> 项目”: 或者按下 组合键,都会弹出下面的对话

  • 这是我的第一个程序,也是我第一次尝试运行它。我在Ubuntu上。 源代码: 这是我尝试运行它时遇到的错误: 编辑:好的,这是我的JRE版本:owner@ubuntu:~$java-版本java版本“1.6.0_24”OpenJDK运行时环境(IcedTea6 1.11.4)(6b24-1.11.4-1ubuntu0.12.04.1)OpenJDK 64位服务器虚拟机(构建20.0-b12,混合模式

  • 我是Mulesoft Dataweave语言的新手,我不明白我在code-1和code-2语法中犯了什么错误。它在if块上显示一个编译时错误。你能建议我在下面的脚本中犯了什么错误吗?