我想知道为什么Linux中的makefile如此有用(我的意思是实际意义)。为什么我们不能仅以常规方式编译所有程序?
Makefile为您完成了很多工作,并且通常比人们意识到的要强大。拿下面的简单makefile
all: helloworld
这是一行,并且(至少是gnu make)会知道运行cc -o helloworld helloworld.c
然后,随着项目的增长,您又添加了一条规则:
helloworld: ui.o xml.o mailcomponent.o
$(CC) $(CFLAGS) -o $@ [email protected] $^
并知道要跑步
cc -c ui.c
cc -c xml.c
cc -c mailcomponent.c
cc -o helloworld helloworld.c ui.o xml.o mailcomponent.o
然后说您想使一切都变得乐观。
CFLAGS=-O2
文件开头会照顾您。
当项目变大时,请跟踪已更改和未更改的文件,以防止不必要的耗时的重新编译。
Makefile是很好的节省时间的工具,我什至没有涉及更高级的食谱。
Linux的normal way
是使用make文件。
它源于人们通过手工或自制脚本来编译越来越复杂的应用程序所犯的所有错误。表示复杂项目的构建依赖关系并非易事。 Make只是提供了一种标准方法来指定此类依赖关系,并提供了一种工具来解析依赖关系并运行关联的构建操作。
即使您在后台使用make文件或类似的东西,也可以简化/自动化构建过程的UI。
UPDATE
对于那些想了解自动制作注释的人,这里有关于该主题的两种不同观点
http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool
http://www.scurrilous.com/blog/archives/2005/08/23/i-hate-automake/
因为常规方法涉及重复并且很容易被错误键入,尤其是当命令变得越来越长且数量更多,并且显示出更多依赖性时。创建一个makefile意味着至少需要执行的所有操作都是运行make
,然后再运行make install
。
makefile很有用,因为(如果定义正确)只允许重新编译进行更改时所需的内容。
在大型项目中,重建程序可能会花费一些认真的时间,因为将要编译和链接许多文件,并且会有文档,测试,示例等。当您在项目上工作并进行一些更改时,烦人,每次都必须等待重建所有内容。
makefile存储一个列表,这些列表用于在给定输入的情况下生成输出所需的“输入”文件,“输出”文件和“命令”。对项目进行更改时,命令make
将检查输入文件的日期和相应输出文件的日期,如果输入文件已更改,它将通过运行命令来重新创建相应的输出。
这当然只是一个非常粗略的描述,因为make比它复杂得多(拓扑排序,宏命令,并行执行),但是它应该可以使您有所了解。
每次更改时重建所有内容都将花费太多时间,并且仅手动重建所需的内容容易出错(如果您忘了拆掉某个部分,您可能最终会认为所做的更改是可以的,但实际上它破坏了某些内容您根本没有重新编译)。
请注意,今天有许多构建系统要比makefile复杂得多(例如,通过分析平台和源代码自动生成makefile)。
这些工具是灵丹妙药还是寻找问题的解决方案是可疑的(我对此有偏见,因为我讨厌构建工具,而他们讨厌我...某种程度上,它们的自动检测逻辑无法在我的机器上正常工作)。 >
复杂度和时间。中型/大型项目包含数百个具有数百个依赖项的文件。您想全部记住吗?手动构建项目时很容易出错。您很容易忘记一个依赖项。大型项目可能需要几分钟的时间来构建。 Make会跟踪时间并仅重新编译那些必需的东西,这样您就无需在开发过程中等待几分钟。
通常的方法是使用makefile。
还因为make是2遍,所以指令的相对顺序无关紧要。