Windows 10未加载版本可执行文件的DLL

Windows 10 not loading DLLs for a release executable

本文关键字:可执行文件 DLL 版本 加载 Windows      更新时间:2023-10-16

环境:

Windows 10 x64

Visual Studio 2008(是的,我知道)

尝试使用gstreamer 1.0构建一个非常简单的x64 C++应用程序。管道在调试模式下运行良好(甚至将图像写入磁盘),但在发布模式下,只要调用任何gstreamer函数,程序就会崩溃。我已经为发布版本收集了以下证据:

  • Visual Studio中的调试显示所需的gstreamer/ghread库未加载到"模块"选项卡中
  • 在发布模式下,通过移动/重命名包含目录(C:\/gstreamer/x64_86/bin)来中断gstreamer/gread库的路径没有任何效果。如果我在调试模式下尝试,那么应用程序在运行时会抱怨找不到所需的DLL
  • 在发布程序上运行dumpbin/dependents表明存在对gstreamer/ghread的依赖关系。调试版本也是如此
  • 从命令行而不是VS运行应用程序会产生相同的结果(崩溃)

我注意到Win10更聪明,如果在运行时丢失了多个DLL(而不仅仅是第一个),它会警告你,但我很困惑,为什么它甚至没有加载它们,也没有警告我它们丢失了。我还能用什么来调试这个问题?

过去发生在我身上的事情:

  1. 在多项目解决方案中,所有项目构建设置都不会同步换句话说,如果我以64位Release配置构建解决方案,configuration Manager是否显示所有以该模式构建的项目,或者其中一些项目是否被遗漏/或具有错误的构建设置?

  2. 由于某种原因,32位版本的DLL一直存在如果构建发生在非默认目录中,这种情况尤其可能发生。在这种情况下,只需废弃构建目录并重新生成即可。

事实证明,这是一个非常棘手的特定于GStreamer的问题,与C运行时库有关。我的同事对GStreamer安装文档进行了更仔细的检查,发现GStreamer使用的是Windows设备驱动程序工具包7.1.0版中"无处不在"的CRT,而不是Visual Studio附带的常规CRT。我们的第一个错误是试图在VS2008中使用VS2010构建的GStreamer库。第二个错误是无意中混淆了&CRT库的匹配。

我们试图忽略需要使用props文件的构建说明,因为它们适用于VS2010,我们仍在处理2008。这是错误的——props文件指示Visual Studio使用DDK中的CRT——必须单独安装。安装文档的以下部分详细介绍了这一点。仍然不太确定为什么这在调试模式下有效。