与将 .c 文件转换为 .o 文件并链接和汇编相比,编译 gcc .c 文件有什么区别?

What is the difference compiling gcc .c file in comparison to making a .c file into an .o file and linking and assembling?

我刚刚开始接触 GCC。

假设我们有一个文本文件,由 vim 编写,标签为 helloworld.c

为什么 SWIM(不是我的人)用

编译它

gcc helloworld.cgcc -c helloworld.c 相比 gcc -o helloWorld helloworld.o ?

编译过程中有一些阶段:

预处理 -> 编译 -> 汇编 -> 链接。

阶段:

  • 预处理:将 .h 文件中的一些测试包含到 .c 文件中并创建预处理的源代码。
  • 编译:从预处理代码创建汇编代码。
  • 汇编:从您的汇编代码创建目标模块。
  • 链接:从您的目标模块创建可执行文件。

当您使用gcc [options]时:

如果您使用:

  • gcc -E 在预处理阶段后停止并为您提供预处理代码。
  • gcc -S 在编译阶段后停止并为您提供汇编代码。
  • gcc -c 在组装阶段后停止并为您提供目标模块。

gcc -o 为您提供包含名称的可执行文件,默认情况下为您提供 a.out

man gcc HERE

一个文件,没有用。 但是,如果您编译一个较大的项目,您可能不想重新编译所有文件,例如,如果您只更改了一个文件。因此,获得编译时间。

使用中间 .o 文件可以让您只重新编译需要重新编译的内容,link 包含所有这些目标文件的最终二进制文件。

另一个用例是,如果您想使用自定义 link 脚本,例如选择您的部分或代码的位置。然后您需要从 .o 个文件中获取实际代码。