我想知道为什么Linux中的makefile非常有用(我的意思是在实际意义上).为什么我们不能以正常方式编译所有程序?
在normal way为Linux是使用make文件.
它是通过手工编写更复杂的应用程序或使用自制脚本编写的所有错误而演变而来的.表示复杂项目的构建依赖关系并非易事.Make简单地提供了一种标准化方法来指定这种依赖关系,以及一个解析依赖关系和运行相关构建操作的工具.
甚至用于简化/自动化构建过程的UI也可以在幕后使用make文件或类似的东西.
UPDATE
对于那些对于automake评论感到疑惑的人,这里有两个不同的观点
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
all: helloworld
Run Code Online (Sandbox Code Playgroud)
这是一行,并且(gnu make,至少)会知道运行cc -o helloworld helloworld.c然后,随着项目的增长,你再添加一条规则:
helloworld: ui.o xml.o mailcomponent.o
$(CC) $(CFLAGS) -o $@ $@.c $^
Run Code Online (Sandbox Code Playgroud)
让make知道要跑
cc -c ui.c
cc -c xml.c
cc -c mailcomponent.c
cc -o helloworld helloworld.c ui.o xml.o mailcomponent.o
Run Code Online (Sandbox Code Playgroud)
然后说你想要优化一切.
CFLAGS=-O2
Run Code Online (Sandbox Code Playgroud)
在文件的开头照顾你.
当项目变大时,make会跟踪已经发生和未发生变化的文件,从而防止无关紧要且耗时的重新编译.
Makefiles是精彩的时间,我甚至没有涉及更高级的食谱.
makefile 很有用,因为(如果正确定义)只允许在进行更改时重新编译所需的内容。
在一个大型项目中,重建程序可能需要一些时间,因为将有许多文件要编译和链接,并且会有文档、测试、示例等。当你在项目上工作时,你做一些小改动会很烦人每次都必须等待重建一切。
生成文件存储一个列表“输入”文件、“输出”文件和在给定输入的情况下产生输出所需的“命令”。当您对项目进行更改时,该命令make将检查输入文件的日期和相应输出文件的日期,如果输入文件已更改,它将通过运行该命令重新创建相应的输出。
这当然只是一个非常粗略的描述,因为 make 比这复杂得多(拓扑排序、宏命令、并行执行)……但它应该给你一个想法。
在每次更改时重建所有内容会花费太多时间,并且仅手动重建需要的内容很容易出错(如果您忘记重建一个部分,您最终可能会认为您所做的更改是可以的,但实际上它破坏了您的某些内容根本就没有重新编译)。
请注意,今天有大量构建系统比 makefile 复杂得多(例如,通过分析您的平台和源代码自动生成 makefile)。
这些工具是灵丹妙药还是寻找问题的解决方案是值得怀疑的(我对此有偏见,因为我讨厌构建工具而他们讨厌我......不知何故,他们的自动检测逻辑在我的机器上永远无法正常工作)。