尝试在 Windows 上执行 C++ 时出错(通过 MinGW 编译)

Posted

技术标签:

【中文标题】尝试在 Windows 上执行 C++ 时出错(通过 MinGW 编译)【英文标题】:Error trying to execute C++ on Windows (compiled via MinGW) 【发布时间】:2020-01-27 17:22:34 【问题描述】:

所以我第一次尝试编译并运行一个我做过的 c++“应用程序”(试图为我的女朋友做一个简单的练习)但是当我尝试在 Powershell 上运行它时,我收到了这个错误:

Program 'Exercice_1.exe' failed to run: The specified executable is not a valid application for this OS platform.At
line:1 char:1
+ .\bin\Exercice_1.exe
+ ~~~~~~~~~~~~~~~~~~~~.
At line:1 char:1
+ .\bin\Exercice_1.exe
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed

代码只是我自己做List的尝试(好吧,它还没有完全编码,但我觉得它与系统的关系比与代码的关系更...)

当我只有一台笔记本电脑时,我在 Code::Blocks 上进行编码,但在那里我尝试在台式计算机上通过命令行编译和运行,我不知道是否必须安装任何东西才能使其工作或者如果它应该工作。

makefile 内容:

CC = g++
CFLAG = -Wall -pedantic
STD = -std=c++11
SRC = src/
INC = include/
OBJ = object/
BIN = bin/

$(BIN)Exercice_1.exe: $(SRC)Exercice_1.cpp $(OBJ)Liste.o $(OBJ)Maillon.o
    $(CC) $(STD) -o $@ -c $< $(CFLAG)

$(OBJ)Liste.o: $(SRC)Liste.cpp $(INC)Liste.h $(INC)Maillon.h
    $(CC) $(STD) -o $@ -c $< $(CFLAG)

$(OBJ)Maillon.o: $(SRC)Maillon.cpp $(INC)Maillon.h
    $(CC) $(STD) -o $@ -c $< $(CFLAG)

clean:
    rm -f -R object/*.o
    rm -f -R *~

mrproper: clean
    rm -f $(BIN)*.exe

我从一个我必须做的旧练习中提取它并重新安排它以适应我当前的尝试,我很确定它应该很好用,所以我不知道什么不起作用。

如果需要:Exercice_1.cpp 文件:

#include <iostream>

#include "../include/Maillon.h"
#include "../include/Liste.h"

int main(int argc, char* argv[]) 
    Maillon<int>* maillon = new Maillon<int>(7);
    std::cout << maillon->get_info() << std::endl;

    return 0;

编辑:

g++ --version的结果

g++.exe (MinGW.org GCC-8.2.0-5) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

系统信息:

System Type:               x64-based PC

重新编辑:

发现错误,它在makefile中... 由于我是从旧项目中复制的,所以我没有正确复制它,这里是更正确的版本:

CC = g++
CFLAG = -Wall -pedantic
STD = -std=c++11
SRC = ./src/
INC = ./include/
OBJ = ./object/
BIN = ./bin/

$(BIN)Exercice_1.exe: $(OBJ)Exercice_1.o $(OBJ)Liste.o $(OBJ)Maillon.o
    $(CC) $(STD) -o $@ $^ $(CFLAG)

$(OBJ)Exercice_1.o: $(SRC)Exercice_1.cpp $(INC)Liste.h $(INC)Maillon.h
    $(CC) $(STD) -o $@ -c $< $(CFLAG)

$(OBJ)Liste.o: $(SRC)Liste.cpp $(INC)Liste.h $(INC)Maillon.h
    $(CC) $(STD) -o $@ -c $< $(CFLAG)

$(OBJ)Maillon.o: $(SRC)Maillon.cpp $(INC)Maillon.h
    $(CC) $(STD) -o $@ -c $< $(CFLAG)

它现在无法编译,但因为我显然在代码中犯了错误并正在尝试纠正它们。

非常感谢大家,尤其感谢 mklement0 的帮助,很高兴看到这个社区有多好!

重新编辑:

现在可以正常工作了:D

【问题讨论】:

这是你在 Linux 机器上编译的 exe,你想在 Windows 机器上运行吗? g++ 通常是 linux 编译器,你是用 MinGW 之类的东西在 Windows 上编译吗? @NathanOliver 它是在 Windows 机器上编译的 @Romen 我正在使用 MinGW,是的 我发现this 似乎相关但我没有使用VSCode,所以我不知道它是否相关......我曾经拥有它但几天前卸载它,如果有帮助吗? 【参考方案1】:

注意:此答案提供了背景信息:它可能会也可能不会解决您的问题。

问题在于 Windows 不知道如何调用您的可执行文件,因为它不使用所需的二进制文件格式

您说您已使用MinGW 编译您的可执行文件,该可执行文件 旨在创建本机 Windows 应用程序。

由于意外 empty 文件不是您的问题(见下文),您需要调查您的 MinGW 编译过程实际用于文件 @ 的可执行文件格式类型987654322@.


您的症状的可能原因是:

如果.\bin\Exercice_1.exe 恰好是一个0 字节)文件而不是预期的可执行文件,则结果将是您看到的错误消息:

# Create an empty *.exe file and try to invoke it.
PS> $null | Set-Content notreal.exe; ./notreal

Program 'notreal.exe' failed to run: The specified executable is not a valid application for this OS platform.
...

然后您需要调查空的.\bin\Exercice_1.exe 文件是如何意外创建的,以及为什么您的编译没有在其中放置有效的可执行文件。

【讨论】:

.\bin\Exercice_1.exe 文件是一个 3KB 的文件,有 139 行不可理解的值,所以它显然不是空的......我还根据您的评论,希望它现在与我的问题更相关。

以上是关于尝试在 Windows 上执行 C++ 时出错(通过 MinGW 编译)的主要内容,如果未能解决你的问题,请参考以下文章

使用 cmake 在 windows 上编译 c++ 数据库时出错

尝试在 Ubuntu 上的 NASM 上运行 .asm 文件时出错

尝试在 C++、MinGW 上获取当前进程内存大小时出错

出错时停止代码执行 (C++)

尝试在 Python 3 中使用 C++ 类时出错

尝试在 Windows 10 上安装 NumPy 和其他库时出错 [重复]