我正在使用 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 *.c
或 gcc -o myprog foo.c bar.c baz.c
也是如此。
回答您的第一个问题:从技术上讲,没有“构建”这个词 :) 但是,“构建”和“编译”这两个词可以互换使用,以描述从源代码生成最终可执行文件的整个过程。
在更精确的上下文中,您会说有:
- 预处理,当预处理程序包含头文件、扩展宏等时。
- 解析,其中解析器标记源文本并生成程序流的结构化数据模型(所谓的抽象语法树)。
- 编译或编译,当代码生成器遍历 AST 并从中生成汇编代码时
- 汇编,当编译器驱动程序调用汇编程序时,汇编程序将汇编文本转换为二进制目标代码,最后
- 链接或链接,当编译器驱动程序调用链接器以查找库中的符号、填充缺失的地址等时。
所以,严格来说,只有第三小步是编译;此外,使用 GNU 工具链和 make,人们倾向于将前四个步骤(从 .c 源文件生成目标文件)编译称为一个步骤。
关于c - 需要澄清用于编译 C 文件的某些术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766257/