c - 需要澄清用于编译 C 文件的某些术语

标签 c gcc compilation building geany

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

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

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

如果我运行 gcc -c helloworld.c,编译器会生成一个 helloworld.o 目标文件。 Geany 将此过程称为编译,编译器说编译成功完成。

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

我知道 -c 选项会生成一个目标文件,并且其中的多个可以与库链接在一起以生成可执行文件,但我不清楚哪种情况是编译,哪种情况正在构建。

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

谢谢

最佳答案

回答您的第二个问题:是的,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...

关于c - 需要澄清用于编译 C 文件的某些术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766257/

相关文章:

gcc - gcc FLTK编译错误

C 表示函数失败的方法

c++ - 如何制作指针的拷贝

c - 具有相同标识符的不同类型变量链接在一起

c++ - 如何在 Ubuntu 中使用 Visual Studio Code 编译 C++ 代码?

c - 编译c程序时创建DEPENDENCIES_OUTPUT文件的目的

.net - 如何使用 Roslyn 添加对在内存流中编译的类型的引用?

java - Heroku 编译参数

c++ - 警告 : conversion to 'unsigned char' from 'int' may alter its value

c - vSphere API 和自动化虚拟机管理