在mingw-w64/msys2编译的应用程序出现错误提示:“应用程序无法正确启动(0xc00007b)”。

7
mingw-w64 64位 Shell 中编译应用程序后,它在 shell 中运行良好,但在正常情况下,在 shell 外运行时会出现错误 the application was unable to start correctly (0xc00007b)
当提示缺失某些必要的 DLL 时,我将一些 DLL 从 msys2/mingw-w64 bin 目录中移动了过来,但现在出现了这个不透明的错误。我做错了什么?
1个回答

8

0xc00007b错误基本上意味着“无效的图像格式”,通常发生在混合64位和32位DLL时。问题是,你有一个64位应用程序正在查找一个特定的DLL,该DLL在全局路径中,但路径中的DLL是32位的。因此,问题是:它不会抱怨缺少的DLL,而是尝试加载它。由于它是一个32位应用程序,而你的应用程序是一个64位应用程序,所以你会得到0xc00007b的错误。

解决方案是将所有相关的DLL复制到应用程序路径中。

接下来的问题是你不知道哪些DLL相关。可以使用msys2 shell执行以下命令:

ldd application.exe

这将为您提供应用程序依赖的DLL列表。将msys2/mingw-w64相关的DLL复制到该目录中。这将使应用程序在查找32位DLL之前先找到它们,而不是查找PATH。


2
Dependency Walker(http://www.dependencywalker.com/)显示所有使用编译时动态链接的依赖项。与您建议使用“ldd”的方法类似,它不会考虑使用运行时动态链接的依赖项(Dependency Walker允许您对应用程序进行分析,因此您可能会以这种方式捕获其中一些依赖项)。 - IInspectable
@IInspectable 当然,我知道Dependency Walker。它是一个很棒的工具。已经好几年没用过了。ldd是mingw-w64的一部分,所以我发现使用它很有用。 - Realz Slaw
感谢有用的线程。我还不确定它是否引起了我的问题,但无论如何都很有价值。既然可能相关:(A)在64位操作系统上反过来运行32位交叉编译的程序时,会发生这种情况吗?(B)您知道为什么,当从资源管理器或命令提示符运行时会出现此错误-当从同一MSYS2提供的“mingw32” shell运行时,该程序仅立即退出而没有明显的错误? - underscore_d
3
很不幸,在我的情况下,ldd 报告了“几个”依赖项,其中包括一些相当无用的依赖项,例如 ??? => ??? (0xd0000),而依赖项检查器则向我显示了确实缺少的依赖项 :| - rogerdpack
复制所有的依赖DLL,我的情况下ldd显示依赖于/c/Windows/System32/ntdll.dll/c/Windows/SysWow64/ntdll.dll,尝试了两种都不起作用。 - 0xB00B

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