在Windows上使用gcc编译:生成的"a.exe"文件消失了

7

我正在使用的是GCC 4.7.1版本,但我也尝试了在GCC 4.8上进行。这是我正试图编译的代码:

#include <stdio.h>

void print(int amount) {
    int i;
    for (i = 0; i < 5; i++) {
        printf("%d", i);
    }
}

int main(int argc, char** argv) {
    print(5);
    return 0;
}

看起来应该可以工作,当我编译时...

gcc main.c

编译需要一段时间,生成了一个 a.exe 文件,但该文件会自动消失。我的代码没有出现任何错误。 以下是证明的gif图片,因为有些人可能会误解: proof

7
你有安装任何杀毒软件吗?尝试禁用它并告诉我们结果。 - Raydel Miranda
将它移动到我的桌面上并尝试在那里编译,结果仍然相同。 - chapman
第三个窗口是Sublime Text 3 - chapman
1
好的,这是一个术语混乱。gcc可能与此无关。查看您的系统日志和防病毒日志。 - n. m.
1
实际上,ahoffer的已删除回答并不是完全正确的;它暗示了文件名a.exe是问题所在。事实上,病毒扫描器检查文件的内容而不是它们的名称。(在这种情况下,这是一个误报。) - Keith Thompson
显示剩余3条评论
8个回答

10

(由于ahoffer的已删除回答不太正确,基于评论中的信息,我将发布这篇文章。)

在Windows上,gcc默认生成一个名为a.exe的可执行文件。(在类UNIX系统上,由于历史原因,其默认名称为a.out。)通常您需要使用-o选项指定名称。

显然,生成的a.exe文件会在您的杀毒软件中产生误报,因此该文件在创建后不久就会被自动删除。我看到您已经与Avast的开发人员联系了,关于这个错误报告问题。

请注意,杀毒程序通常检查文件的内容,而不是文件的名称,因此使用名称不同于a.exe的文件无法解决问题。但是,对程序进行某些更改可能会使可执行文件的内容发生足够的变化,以避免出现问题。

您可以尝试编译一个简单的“Hello,world”程序,以查看是否会发生相同的情况。

感谢Chrono Kitsune在评论中链接到这个相关的Mingw-users讨论

这与您的问题无关,但是在程序输出的末尾应该打印一个换行符('\n')。在您的Windows环境中可能并不重要,但通常情况下,程序的标准输出几乎总是在最后一行末尾具有换行符。


4
尝试使用类似以下命令编译,但不包含所有标准库:
gcc -nostdlib your_file.c
gcc  -nostdlib -c  test.c -o test.o; gcc test.o -lgcc -o test.exe

其中一个MinGW库二进制文件可能会产生误报,了解哪个库将会很有用。


我曾经遇到过同样的问题,按照这种方式编译我的文件有所帮助。你有什么想法可以缩小是哪个库引起了问题吗? - Slovakov

3

您的代码没有问题,只是正常退出。

您需要在命令行中运行它,这将显示所有信息。

开始->运行->cmd,然后cd到您的目录。然后运行a.exe。如果您不想这样做,可以在main函数中的return语句之前添加sleep()。

此外,在您的代码中,当您将print(5)传递给您的函数时,它并没有被使用。


当我试图解决这个问题时,我将for循环从0到amount改为了0到5。同时我在命令行中运行它。如果a.exe不存在,我就无法运行它。 - chapman
我看到我误读了你的问题。它说的是a.exe消失了,而不是终端窗口。我很抱歉。 - Scotty Bauer
啊,这就有意义了 :) - chapman
我认为你说的有道理,因为在调用print(int)函数后,我打印了一些文本,它可以正常执行。有什么想法吗? - chapman
尝试添加 -O0 标志并查看是否有所作用。GCC 可能因某些不可思议的原因优化了所有内容。 - Scotty Bauer
显示剩余3条评论

0

我确认这是由于防病毒软件。
我进行了以下测试:
在t=0编译helloworld.c;
在1秒钟内告诉McAfee不再将helloworld.exe视为威胁。>>文件仍然存在。
如果我太慢,文件就会被删除。

Antivirus next to compilation instructions


-1
如果在运行文件时出现“在a.exe附近”的错误,请按以下步骤操作: 1.打开病毒和威胁防护 2.在病毒和威胁防护设置中选择管理设置 3.实时保护和云递送保护处于“开启”状态,则关闭实时保护和云递送保护!

(https://istack.dev59.com/mcIio.webp)


-2

a.exe也是一种病毒的名称。我怀疑你的电脑安全软件正在删除或隔离该文件,因为它认为它是一个病毒。使用redFIVE的建议将输出文件重命名为“print.exe”,以便病毒扫描程序不会删除它。


我尝试了redFives的建议,但没有起作用。此外,如果我的杀毒软件要隔离文件,它会通知我。 - chapman

-2

你试试:

gcc -o YOUR_PROGRAM.exe main.c

2
通常情况下,您需要在“代码”旁边提供注释。 - aliteralmind

-2

你可以在防病毒软件的“排除扫描路径”部分指定完整的文件路径(例如:c:\MyProject),以防止其删除你的 .exe 文件。


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