回答

5

它是有用的,以减少重建时间。如果只更改一个源文件 - 通常不需要重新编译整个项目,而只需要一个或几个文件。

0

实际上,这根本不重要。特别是对于比较简单的程序,这两个步骤都用一个程序调用,如

gcc f1.c f2.c f3.c f4.c -o program 

它创建从这些源文件的可执行program执行。

但事实是这些都是单独的过程,在某些情况下值得注意。

2

因为编译负责将每个源代码文件的源代码转换为相应的目标代码。而已。所以编译器不必关心你的外部符号(如库和变量)。

链接负责找到这些引用,然后生成一个单独的二进制文件,就像您的项目被编写为单个源代码文件一样。 (我也建议你应该参考维基百科linking页面了解静态和动态链接之间的differnce)

如果你碰巧使用该工具Make,你会看到,当你调用make它不会重新编译每一个文件,它会查找自上次构建以来哪些文件已被修改,然后仅重新编译它们。然后调用链接过程。当你处理大型项目(例如linux内核)时,这是一个很大的节省时间。

2

这些日子可能不像以前那么重要。

但是有一段时间编译项目可能需要几天的时间 - 我们过去在80年代的一个周末做了一个“完整构建”。仅仅解析单个文件的源代码是一件相当大的事,需要大量的时间和内存,所以设计语言的目的是为了使它们的模块(源文件)能够被隔离处理。

,结果是“目标文件” - .obj(DOS/Windows的/ VMS)和.o(UNIX)文件 - 包含的重定位代码,静态数据,和(我们​​定义的对象)出口的列表和进口(我们需要的物品)。链接阶段将所有这些集中到一个可执行文件中,或者粘贴到一个存档中(.lib,.a,.so,.dll文件等)以供进一步包含。

让昂贵的编译任务独立运作,带动了像make这样复杂的增量构建工具的生成,这些工具显着提高了编程人员的生产力 - 对于大型C项目(如Linux内核)仍然至关重要。

它也很有用,意味着任何可以编译成目标文件的语言都可以链接在一起。因此,通过一点点努力,可以将C连接到Fortran,将COBOL连接到C++等等。

自从那些日子以来,开发了许多语言已经推动了可以存储在目标文件中的内容的边界。C++模板系统需要特殊处理,并且重载方法不太适合,只要.o文件不支持具有相同名称的多个函数(请参阅C++ name mangling)。 Java等人使用完全不同的方法,使用自定义代码文件格式和粘贴到DLL和共享对象文件的“本地代码”调用机制。

0

我已经在需要两天编译它们的系统上工作过。你不想做一个小的改变,然后必须等待2天才能测试。