Windows 10无法加载发布可执行文件的DLLs。

3

环境:

Windows 10 x64

Visual Studio 2008(是的,我知道)

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

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

我注意到Win10更智能,并且会在运行时警告您缺少多个DLL(而不仅是第一个DLL)。但是我困惑的是为什么它甚至没有加载它们,并且没有警告我它们缺失。我还能用什么来调试这个问题?


你可以尝试使用进程监视器(Process Monitor)来查看进程正在寻找什么,以及在哪里。https://technet.microsoft.com/zh-cn/sysinternals/processmonitor - bialpio
2个回答

1

过去导致这种情况发生的原因:

  1. 在多项目解决方案中,所有项目构建设置没有同步。 换句话说,如果我在64位发布配置中构建解决方案,则配置管理器是否显示所有项目都以该模式构建,还是有一些项目被遗漏或具有错误的构建设置?

  2. 32位DLL版本由于某些原因仍然存在。 如果构建发生在非默认目录中,特别容易发生这种情况。在这种情况下,只需删除构建目录并重新构建即可。


0
原来这是一个非常棘手的 GStreamer 特定问题,与 C 运行时库有关。我的同事仔细检查了 GStreamer 安装文档 后发现,GStreamer 使用的是 Windows 设备驱动程序套件版本 7.1.0 中“无处不在”的 CRT,而不是 Visual Studio 自带的常规 CRT。我们的第一个错误是尝试在 VS2008 中使用 VS2010 构建的 GStreamer 库。第二个错误是不小心混合和匹配 CRT 库。
我们试图忽略构建说明,因为它们是针对 VS2010 的,而我们仍在处理 2008。这是错误的 - props 文件指示 Visual Studio 使用 DDK 中的 CRT - 必须单独安装。安装文档的以下部分 详细介绍了这一点。仍然不确定为什么在调试模式下可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接