什么是多重编译,如何工作以及为什么我应该使用它?

时间:2013-11-25 16:31:59

标签: c compilation

我正在学习C,我只读了多个编译这个术语。
到现在我有一个文件。我使用命令gcc file.c编译它然后./a.out到执行它。但我有点困惑。什么时候我应该使用多重编译而不是单一编辑,这可能是因为他们会让我更喜欢多重编译而不是单一编辑?

我搜索了它,我发现了一些文章但是他们没有完全涵盖我的问题。 1 (this is for c++)2

如果我在我的项目中有一些files.c,例如file1.c,file2.c然后我想要链接它们,我会感觉不好执行

gcc file1.c
gcc file.c
gcc file1.o file2.o //somehow i have to create the .o files..

谢谢..

2 个答案:

答案 0 :(得分:2)

编译需要时间。重新编译没有改变的C代码是没有意义的。因此,对于大型项目,将代码分成多个文件(当然通常不是随机的,而是分成不同功能的模块)是有意义的,并且只在需要时才编译它们。

链接是获取一堆目标代码(调用.o文件的内容)并将它们转换为单个程序的过程。

答案 1 :(得分:1)

要编译的步骤很多。

当您调用gcc时,默认情况下会创建一个可执行文件,即一次性完成所有步骤:

  • .c - > .i预处理器
  • .i - > .s编译器
  • .s - > .o汇编程序
  • *.o - > a.out链接器

一般来说,前两个占用的时间最多。如果您有一个大型项目,那么重新编译整个项目可能会花费大量时间进行开发。因此,编译器允许您在某个点停止并重用以前未更改的文件结果:

  • gcc -E仅用于预处理(很少使用)
  • gcc -S编译,但不要汇编。用于调试或优化装配
  • gcc -c编译,汇编,但不要链接。这是最常用的一个并生成目标文件。那些包含你的汇编函数(目标代码),但它不能运行,因为还没有所有函数存在,库函数丢失,可执行文件头没有被链接。

最后一步gcc -o executable *.o将接受所有这些并将它们链接在一起以创建可执行文件。可选择将库链接到其中。

通常在一个源文件中包含所有函数将允许编译器执行更多优化(即内联),但代价是编译时间。

查看https://cs.senecac.on.ca/~btp200/pages/images/compile_link.png