Windows 10未加载版本可执行文件的DLL
Windows 10 not loading DLLs for a release executable
环境:
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(而不仅仅是第一个),它会警告你,但我很困惑,为什么它甚至没有加载它们,也没有警告我它们丢失了。我还能用什么来调试这个问题?
过去发生在我身上的事情:
-
在多项目解决方案中,所有项目构建设置都不会同步换句话说,如果我以64位Release配置构建解决方案,configuration Manager是否显示所有以该模式构建的项目,或者其中一些项目是否被遗漏/或具有错误的构建设置?
-
由于某种原因,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——必须单独安装。安装文档的以下部分详细介绍了这一点。仍然不太确定为什么这在调试模式下有效。
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 可执行文件C++包括.obj,.lib和.dll吗?
- python37.dll在可执行文件中未链接
- Pyinstaller创建的可执行文件找不到Meipass目录中存在的DLL
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 可执行文件如何从DLL文件找到函数
- 合并 c 可执行文件、托管 COM dll 和 .Net GUI
- 如何在运行时像可执行文件一样"启动"DLL?
- Windows 10未加载版本可执行文件的DLL
- 调试链接到发布可执行文件的调试 DLL
- 在运行时在v110可执行文件中使用v90 COM dll是否安全
- 如果你链接到一个DLL,如果该DLL丢失,是否可以启动你的可执行文件
- 使用.dll文件编译可执行文件,.dll与.exe相关的文件
- 没有 DLL 依赖项的静态构建可执行文件
- 如何检查可执行文件或 DLL 是否在发布或调试模式下生成 (C++)
- Winelib可以将DLL直接链接到ELF可执行文件吗?
- C++程序上的执行错误:静态可执行文件调用 DLL 库
- 在可执行文件中插入dll代码,使其不受依赖
- 缺少msvcr100.dll-如何使可执行文件向后兼容
- 可以对dll进行更改,同时保持与预编译的可执行文件的兼容性吗?