4

我正在使用 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 finished successfully.

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

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

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

谢谢

4

3 回答 3

3

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

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

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

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

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

更多关于这一切的...

于 2012-10-07T05:16:33.157 回答
2

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

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

于 2012-10-07T05:09:41.990 回答
0

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

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

于 2012-10-07T05:10:53.860 回答