在 mingw-w64/msys2 中编​​译的应用程序,“应用程序无法正确启动(0xc00007b”

Posted

技术标签:

【中文标题】在 mingw-w64/msys2 中编​​译的应用程序,“应用程序无法正确启动(0xc00007b”【英文标题】:Application compiled in mingw-w64/msys2, "the application was unable to start correctly (0xc00007b" 【发布时间】:2016-03-23 06:55:19 【问题描述】:

mingw-w64 64-bit Shell中编译一个应用程序后,它在shell内运行良好,但在shell外正常运行时报错the application was unable to start correctly (0xc00007b)

当它抱怨丢失它们时,我从 msys2/mingw-w64 bin 目录中移动了一些必要的 DLL,但现在它给出了这个不透明的错误。我做错了什么?

【问题讨论】:

【参考方案1】:

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

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

下一个问题是你不知道哪些。

你可以用msys2 shell做的是:进入目录并运行命令:

ldd application.exe

这将为您提供应用程序所依赖的 DLL 列表。将msys2/mingw-w64相关的DLL复制到目录下。这将允许应用程序在查找 PATH 并查找 32 位 DLL 之前找到它们。

【讨论】:

Dependency Walker 显示使用编译时动态链接链接的所有依赖项。与使用 ldd 的建议方法类似,它不会考虑使用运行时动态链接链接的依赖项(Dependency Walker 允许您分析您的应用程序,因此您可以通过这种方式捕获其中一些)。 @IInspectable 当然,我知道依赖walker。这是一个很棒的工具。好多年没用过了。 ldd 是 mingw-w64 的一部分,所以我发现使用它很有用。 感谢有用的线程。尚不确定它是否会导致我的问题,但无论哪种方式都很有价值。因为它可能是相关的:(A)在 64 位操作系统上运行 32 位交叉编译程序时是否会发生这种情况,以及(B)你知道为什么,而从资源管理器或命令提示符运行会出现此错误 -当从同一个 MSYS2 提供的 mingw32 shell 运行时,程序会立即退出而没有明显错误? 不幸的是,至少在我的情况下,ldd 报告了“一些”依赖项,包括一些相当无用的依赖项,例如 ??? => ??? (0xd0000),而依赖项步行者向我展示了实际上缺少的依赖项:|

以上是关于在 mingw-w64/msys2 中编​​译的应用程序,“应用程序无法正确启动(0xc00007b”的主要内容,如果未能解决你的问题,请参考以下文章

mingw64+msys2下使用cmake问题

使用命令行在 Visual Studio 中编译为发行版

怎么在windows中编iphone\itouch程序。最好能是win7环境

Makefile,在 src 目录树中查找源代码并在构建文件中编译为 .o

spring中编程式事务控制

如何将使用sysioctl.h的代码移植到MinGW gcc中?