我想知道为什么Linux中的makefile非常有用(我的意思是在实际意义上)。为什么我们不能以正常方式编译所有程序?
答案 0 :(得分:9)
Linux的normal way
是使用make文件。
它是通过手工编写更复杂的应用程序或使用自制脚本编写的所有错误而演变而来的。表示复杂项目的构建依赖关系并非易事。 Make简单地提供了一种标准化方法来指定这种依赖关系,以及一个解析依赖关系和运行相关构建操作的工具。
甚至用于简化/自动化构建过程的UI也可以在后台使用make文件或类似内容。
<强>更新强>
对于那些对于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/
答案 1 :(得分:7)
因为正常的方式涉及重复并且很容易被错误输入,特别是当命令变得越来越长,并且出现更多依赖性时。创建一个makefile意味着至少需要做的就是运行make
,然后选择make install
。
答案 2 :(得分:7)
Makefiles为你做了很多工作,而且往往比人们意识到的更强大。采用以下简单的makefile
all: helloworld
这是一行,并且(gnu make,至少)知道运行cc -o helloworld helloworld.c
然后,随着项目的增长,你再添加一条规则:
helloworld: ui.o xml.o mailcomponent.o
$(CC) $(CFLAGS) -o $@ $@.c $^
并且知道要运行
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
在文件的开头照顾你。
当项目变大时,make会跟踪已经更改过的文件,防止无关紧要的重新编译。
Makefiles是精彩的节省时间,我甚至没有涉及更高级的食谱。
答案 3 :(得分:3)
makefile很有用,因为(如果正确定义)只允许重新编译进行更改时所需的内容。
在一个大型项目中,重建程序可能需要一些时间,因为会有许多文件需要编译和链接,并且会有文档,测试,示例等。当您处理项目并进行一些更改时每次都要等到重建一切都会很烦人。
makefile存储列表“输入”文件,“输出”文件和产生输入所需的“命令”。当您对项目进行更改时,命令make
将使用相应输出文件的日期检查输入文件的日期,如果输入文件已更改,则将通过运行命令重新创建相应的输出。
这当然只是一个非常粗略的描述,因为make比这更复杂(拓扑排序,宏命令,并行执行)......但它应该给你一个想法。
在每次更改时重建所有内容都需要花费太多时间,并且只需要手动重建所需的内容就容易出错(如果你忘记重新制作一篇文章,你可能最终会认为你做出的改变是好的,而实际上它正在破坏你根本没有重新编译的东西。)
请注意,今天有许多构建系统比makefile复杂得多(例如,通过分析平台和源代码自动生成makefile)。
那些工具是银弹或寻找问题的解决方案是值得怀疑的(我对此有偏见因为我讨厌构建工具而他们讨厌我......不知何故他们的自动检测逻辑在我的机器上永远不能正常工作)。
答案 4 :(得分:1)
复杂性和时间。中型/大型项目包含数百个具有数百个依赖项的文件。你想要记住它们吗?手动构建项目时很容易出错。你很容易忘记一个依赖。一个大项目可能需要几分钟才能建成。 Make跟踪时间并仅重新编译那些必要的东西,这样你就不需要在开发过程中等待几分钟。
总结就是让生活更轻松。
答案 5 :(得分:0)
正常的方法是使用makefile。
它很有用,因为它被设计为完全符合此目的的工具:-) 这就是为什么它也是一种正常的方式。 : - )
答案 6 :(得分:0)
还因为make是2遍,所以指令的相对顺序无关紧要。
通常,必须手动处理依赖项,并且在进行任何更改之前,我们应始终记住每行的执行顺序。与此相反,例如,使用脚本将CFLAGS添加到所有makefile的末尾。您无需担心SOURCES和CFLAGS的相对顺序。