【问题标题】:Windows 10 not loading DLLs for a release executableWindows 10 不为发布的可执行文件加载 DLL
【发布时间】:2016-10-06 09:15:15
【问题描述】:

环境:

Windows 10 x64

Visual Studio 2008(是的,我知道)

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

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

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

【问题讨论】:

标签: c++ visual-studio dll visual-studio-2008


【解决方案1】:

过去导致这种情况发生在我身上的事情:

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

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

【讨论】:

    【解决方案2】:

    原来这是一个非常棘手的特定于 GStreamer 的问题,它与 C-Run Time 库有关。我的同事对GStreamer installation docs 进行了更仔细的检查后发现,GStreamer 使用的是 Windows 设备驱动程序工具包版本 7.1.0 中的“无处不在”的 CRT,而不是 Visual Studio 附带的常规 CRT。我们的第一个错误是尝试在 VS2008 中使用 VS2010 构建的 GStreamer 库。第二个错误是 CRT 库的无意混搭。

    我们试图忽略需要使用 props 文件的构建指令,因为它们适用于 VS2010,我们仍在处理 2008。这是错误的 - props 文件指示 Visual Studio 使用 DDK 中的 CRT -哪一个必须单独安装。安装文档的The following section 详细提到了这一点。仍然不太清楚为什么这在调试模式下有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2016-04-17
      相关资源
      最近更新 更多