回答
它是有用的,以减少重建时间。如果只更改一个源文件 - 通常不需要重新编译整个项目,而只需要一个或几个文件。
实际上,这根本不重要。特别是对于比较简单的程序,这两个步骤都用一个程序调用,如
gcc f1.c f2.c f3.c f4.c -o program
它创建从这些源文件的可执行program
执行。
但事实是这些都是单独的过程,在某些情况下值得注意。
因为编译负责将每个源代码文件的源代码转换为相应的目标代码。而已。所以编译器不必关心你的外部符号(如库和变量)。
链接负责找到这些引用,然后生成一个单独的二进制文件,就像您的项目被编写为单个源代码文件一样。 (我也建议你应该参考维基百科linking页面了解静态和动态链接之间的differnce)
如果你碰巧使用该工具Make
,你会看到,当你调用make
它不会重新编译每一个文件,它会查找自上次构建以来哪些文件已被修改,然后仅重新编译它们。然后调用链接过程。当你处理大型项目(例如linux内核)时,这是一个很大的节省时间。
这些日子可能不像以前那么重要。
但是有一段时间编译项目可能需要几天的时间 - 我们过去在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和共享对象文件的“本地代码”调用机制。
我已经在需要两天编译它们的系统上工作过。你不想做一个小的改变,然后必须等待2天才能测试。
你为什么认为这很重要? –
我看到很多网站和教程正在单独做这个过程 – Luca