【问题标题】:How to run C code/file with MINGW?如何使用 MINGW 运行 C 代码/文件?
【发布时间】:2011-10-29 04:05:12
【问题描述】:

好吧,我刚开始学C语言,看了很多人建议用MinGW做编译器。我下载,安装并正确设置(我认为)并设置路径。一切似乎都很好。 我的问题是,当我执行以下操作时,我找不到从 CMD 运行 C 文件的方法:

C:\>gcc a\c1.c

CMD 上没有显示任何内容

在 c1.c 文件中,我有以下内容:

#include <stdio.h>

int main(void)
{
    printf("this is a test.\n");
    return 0;
}

我尝试了 tcc 编译器,当以这种方式使用它时:

C:\>tcc a\c1.c

它输出以下内容:

this is a test.

我怎样才能使 MinGW 以同样的方式输出? 我查看了 MinGW/gcc 手册和 HowTos,但找不到做同样事情的方法。

【问题讨论】:

    标签: c gcc mingw


    【解决方案1】:

    gcc filename.c 编译并链接您的文件——但它不会像您预期的那样将可执行文件写入hello.exe(当然它不会执行它)。

    并且,与基于 Unix 的工具的约定一样,gcc 通常不会打印任何内容,除非出现问题。它完成并且你得到一个新的C:\&gt; 提示的事实告诉你它成功了。

    在 Unix 上,由于历史原因,可执行文件的默认名称是 a.out。对于 MinGW,默认名称为 a.exe

    所以在运行gcc a\c1.c之后,你可以运行a.exe或者.\a.exe来运行程序。

    或者,更好的是,正如 Doug 建议的那样,您可以使用 -o 选项来指定生成的可执行文件的名称。

    (如果您只想运行编译器并生成目标文件而不是可执行文件,请使用gcc -c。)

    【讨论】:

    • 感谢基思的解释。另一个问题是:当我使用gcc -c 时,它会输出一个您提到的目标文件,但这不会打印任何内容。如果我运行gcc c1.o 它会创建一个(n)a.exe 文件,然后在运行a.exe 文件时,它会打印句子this is a test.,这是正常行为吗?还是我做错了什么?如果我理解正确,如果不运行.exe 文件,就无法在 gcc 中打印任何内容,对吧?
    • 是的,这完全正常。 gcc 保持安静,除非它有重要的事情要说。作为一个实验,试着引入一个错误,从你的源文件中删除一个分号,然后重新编译,看看 gcc 是什么意思。
    • GCC 是一个编译器。它主要会打印警告和错误消息(你应该避免这种情况)。编译后,您的程序将执行您指示它执行的任何操作。如果源代码包含 printf 或 puts 之类的输出函数恰好被执行,它确实会输出一些东西。但是您的程序也可能崩溃或行为不正确。纠正这称为调试。
    • 非常感谢,基思。我想在我习惯它并理解它是如何工作之前,我必须先玩一段时间 C。非常感谢您的帮助。 :)
    • 重要的是要知道 gcc 的行为(-c 禁止链接,a.exe 作为默认的可执行文件名,最小或没有可见输出)是由 C 语言定义。这只是一种特定编译器的特性。其他的可能表现不同,但仍然是完全有效的 C 编译器。
    【解决方案2】:

    tcc 正在编译、链接和执行你的 C 文件。

    gcc 正在编译你的 C 文件,但没有链接或执行它。

    试试:

    C:\>gcc -o a\ci.exe a\c1.c
    

    紧随其后

    a\ci.exe
    

    一旦你弄清楚了,你就会想了解make

    【讨论】:

    • 这不太正确。它编译和链接,但生成的可执行文件的名称不是您所期望的。看我的回答。
    • 感谢您提供的信息,道格。 :)
    【解决方案3】:

    由于您是新手,我强烈建议您使用-Wall 标志(以获取GCC 可以给您的所有警告)和-g 标志(以获取可调试的可执行文件)进行编译。养成改进代码的习惯,直到不再收到警告为止。事实上,学习如何使用make。如果您希望编译器 optimize 生成的代码,请将 -g 替换为 -O2 (但要在程序正确运行并且您已经调试过它时这样做)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2021-07-19
      相关资源
      最近更新 更多