【问题标题】:Need clarification about certain terms used to do with compiling C files需要澄清用于编译 C 文件的某些术语
【发布时间】:2012-10-07 05:04:50
【问题描述】:

我正在使用 GCC 编译器和 Geany(Arch Linux,如果它有所作为的话)学习 C。但是,我在 Geany 和 Internet 上看到 compile 和 build 这两个词可以互换使用。我要求澄清我理解编译过程的方式是正确的,因为谷歌搜索只会让我更加困惑。

假设我写了一个简单的 helloworld.c 文件:

#include <stdio.h>
int main(void)
{
    printf("Hello world!");
    return 0;
}

如果我运行gcc -c helloworld.c,编译器会生成一个 helloworld.o 目标文件。 Geany 称这个过程为compilation,编译器说Compilation finished successfully.

现在,如果我运行gcc -o helloworld helloworld.c,编译器会生成一个名为helloworld 的可执行文件,Geany 将其称为building。但是,编译器又说Compilation finished successfully.

我知道 -c 选项会生成一个目标文件,并且其中的多个可以与库链接在一起以生成一个可执行文件,但我对哪个场景是编译以及哪个场景正在构建感到困惑。

此外,如果我在项目中只有一个源文件,例如单个 helloworld.c 文件,gcc -o helloworld helloworld.c 是否足以将源代码转换为可执行文件?

谢谢

【问题讨论】:

    标签: c gcc compilation building geany


    【解决方案1】:

    回答你的第二个问题:是的,gcc -o myprog myprog.c 很好。 gcc -o myprog *.cgcc -o myprog foo.c bar.c baz.c 也是如此。

    回答您的第一个问题:从技术上讲,没有“构建”这个词 :) 但是,“构建”和“编译”这个词可以互换使用来描述从源代码生成最终可执行文件的整个过程。

    在更精确的上下文中,您会说有:

    • 预处理,当预处理器包含头文件、扩展宏等时。
    • 解析,解析器对源文本进行标记并生成程序流的结构化数据模型(所谓的抽象语法树)。
    • 编译或编译,当代码生成器遍历 AST 并从中生成汇编代码时
    • 汇编,当编译器驱动程序调用汇编程序将汇编文本转换为二进制目标代码,最后
    • 链接或链接,当编译器驱动程序调用链接器在库中查找符号、填写缺失的地址等时。

    所以,严格来说,只有第三小步是编译;此外,使用 GNU 工具链和 make,人们倾向于将前四个步骤(从 .c 源文件生成目标文件)编译为一个。

    More on all this here...

    【讨论】:

    • 谢谢,帮了大忙!另外感谢有关使用 gcc 的提示,我不知道您可以提供多个源文件作为参数将它们全部转换为单个可执行文件。
    【解决方案2】:

    编译通常被认为是将源代码转换为机器代码,但不一定还链接机器代码以创建最终的可执行文件。构建是一个更通用的术语,用于描述创建最终可执行文件的整个过程。构建将涉及编译和链接。如果您不使用 -c 选项,则链接会自动完成,因此这将被视为构建,但编译也是该过程的一部分。

    您可能会发现这些术语的使用有点松散。

    【讨论】:

      【解决方案3】:

      当你编译一个程序时,编译器只是检查文件中是否有任何编译时错误(例如语法和语义错误)。当你“构建”程序时,编译器首先检查其中是否有任何错误,然后将源代码转换为机器代码(实际编译)并在此过程中创建一个可执行文件。

      对于第二个问题,是的,仅gcc -o helloworld helloworld.c 就足以“将源代码转换为可执行文件”。

      【讨论】:

      • 我认为最好使用确切的术语回答 OP 的问题 - 这就是他正在寻找的。另外,你错过了他的第二个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-29
      • 2021-02-03
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多