【发布时间】:2019-04-24 16:23:44
【问题描述】:
我一直在尝试对为什么会收到此错误进行大量研究,并且我发现该错误本质上意味着在 32 位程序上加载 64 位 SDL 时出现 BAD_IMAGE_FORMAT。但是,我似乎在所有编译的可执行文件上都收到了这个错误。
一点背景信息:我一直在搞乱 SDL2(也使用 SDL2_image 和 SDL2_ttf)。当我试图将一个简单的蛇游戏构建为 .exe 时,我开始遇到这个问题。经过一番研究,我决定使用 64 位进行 mingw 的全新安装,仅使用 SDL2、SDL2_image 和 SDL2_ttf 的 64 位开发库。在由于错误代码 0xc000007b 仍然无法启动 .exe 之后,我决定我会变得更简单,并通过每个单独的库来查看是否可以找到我出错的地方。我首先使用了一个简单的“Hello World”程序:
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Hello World" << std::endl;
return 0;
}
使用生成文件:
cmake_minimum_required(VERSION 3.9)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 11)
add_executable(HelloWorld main.cpp)
当然可以构建(作为调试和发布)并且在 Clion 中运行没有问题。但是,在运行构建的可执行文件时,我仍然收到错误代码 0xc000007b,并且我的可执行文件无法启动。在这一点上,我觉得事情开始变得有点奇怪,所以我决定通过运行依赖遍历器并分析我的可执行文件来采用一个常见的建议。 似乎所有东西(SDL2 程序或简单的 hello world 程序)我都遇到了 conhost.exe 失败。下面是依赖 walker 的最后几条语句。
Loaded "CLBCATQ.DLL" at address 0x00007FFFCFC50000. Successfully hooked module.
DllMain(0x00007FFFCFC50000, DLL_PROCESS_ATTACH, 0x0000000000000000) in "CLBCATQ.DLL" called.
DllMain(0x00007FFFCFC50000, DLL_PROCESS_ATTACH, 0x0000000000000000) in "CLBCATQ.DLL" returned 1 (0x1).
onecore\windows\core\console\open\src\host\srvinit.cpp(411)\conhost.exe!00007FF6EA38C372: (caller: 00007FF6EA388CD9) ReturnHr(3) tid(54b4) 80070032 The request is not supported.
onecore\windows\core\console\open\src\server\devicecomm.cpp(153)\conhost.exe!00007FF6EA38A79A: (caller: 00007FFFCF553034) ReturnHr(4) tid(54b4) 800700E9 No process is on the other end of the pipe.
Exited "CONHOST.EXE" (process 0x5150) with code 0 (0x0).
所以我读过一些关于 Conhost 的相互矛盾的东西,我读过它是恶意软件,但我认为我的情况并非如此,因为我没有看到 conhost.exe 在我的任务管理器中运行(这似乎表明存在恶意软件)。我唯一的线索是主机指的是“控制台窗口主机”。所以我真的不知道该怎么做,因为我似乎无法构建任何独立的可执行文件。
最后这里有几个注释。
我的计算机上的其他可执行文件没有任何其他问题。 (也就是不是我使用 Clion 构建的)
我使用的是 64 位计算机 (Windows)。
Hello World 程序正在运行,但文件夹中没有任何 dll(只有 HelloWorld.exe)。
我正在使用 Clion。
程序是用 C++ 编写的
编辑:在帖子中我没有在 include 之前添加 # 。为了消除任何未来的困惑,我在帖子中手工编写了上面的代码(没有复制和粘贴),所以如果这篇文章中有小错误,它们不会出现在我的实际代码中。
【问题讨论】:
-
可能不相关:您的 HelloWorld 应该包含
stdio.h而不是iostream以使用printf或cstdio然后使用std::printf或更好地使用std::cout而不是printf. -
你说得对,我的错,只是快速地将它拼凑在一起,没有任何想法。不过这个问题没有解决办法。
-
您最终解决了这个问题吗?