我想知道为什么Linux中的makefile如此有用(我的意思是在实际意义上)。为什么我们不能用正常的方式编译所有的程序呢?
daolsyd01#
Linux的normal way使用makefile。它是从人们手工或用自制脚本编译越来越复杂的应用程序所犯的所有错误中发展出来的。表示复杂项目的构建依赖关系是非常重要的。Make只是提供了一种标准化的方式来指定这种依赖关系,并提供了一个工具来解析依赖关系并运行相关的构建操作。即使是简化/自动化构建过程的UI,也会在幕后使用make文件或类似的东西。
normal way
更新
对于那些想知道汽车评论,这里有两个不同的观点的主题http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtoolhttp://www.scurrilous.com/blog/archives/2005/08/23/i-hate-automake/的
vc6uscn92#
Makefile为您做了这么多工作,而且常常比人们意识到的更强大。以下面的简单makefile为例
all: helloworld
字符串这是一行代码,并且(至少是gnumake)知道运行cc -o helloworld helloworld.c。然后,随着项目的增长,您需要再添加一条规则:
cc -o helloworld helloworld.c
helloworld: helloworld.o ui.o xml.o mailcomponent.o $(CC) -o $@ $@.c $^ $(LDLAGS)
型让他们知道要逃跑
cc -c ui.c cc -c xml.c cc -c mailcomponent.c cc -c helloworld.c cc -o helloworld helloworld.o ui.o xml.o mailcomponent.o
型然后说你想优化一切。“
CFLAGS=-O2
型文件开头处的会处理您的事务。当项目变大时,make会跟踪已更改和未更改的文件,从而防止无关的、耗时的重新编译。Makefile是很棒的省时工具,我甚至还没有接触到更高级的食谱。
nbnkbykc3#
因为通常的方式涉及重复,并且很容易输入错误,特别是当命令变得更长、更多,并且出现更多依赖项时。创建一个makefile意味着至少需要运行make,然后可选地运行make install。
make
make install
x759pob24#
makefile很有用,因为(如果定义正确)只允许在进行更改时重新编译所需的内容。在一个大型项目中,重建程序可能需要一些时间,因为会有许多文件需要编译和链接,并且会有文档,测试,示例等。当你在项目上工作时,你做了一点修改,每次都要等待重建一切,这会很烦人。一个makefile存储一个列表“输入”文件,“输出”文件和“命令”需要产生给定的输入输出。当您对项目进行更改时,命令make将检查输入文件的日期与相应输出文件的日期,如果输入文件已更改,则将通过运行命令重新创建相应的输出。这当然只是一个非常粗略的描述,因为make比这复杂得多(拓扑排序,宏命令,并行执行)。但应该能给予你有所了解在每次更改时重建所有内容将花费太多时间,并且仅手动重建所需的内容容易出错(如果您忘记重建某个部分,则可能最终会认为您所做的更改是可以的,而实际上它正在破坏您根本没有重新编译的内容)。请注意,现在有很多比makefile复杂得多的构建系统(例如,通过分析平台和源代码自动生成makefile)。这些工具是一颗银还是一个寻找问题的解决方案是值得怀疑的(我对此有偏见,因为我讨厌构建工具,他们也讨厌我……)不知何故,他们的自动检测逻辑在我的机器上从来没有正确工作过)。
cyvaqqii5#
复杂性和时间。一个中/大规模项目包含数百个文件和数百个依赖项。你想把它们都记住吗手动构建项目时很容易出错。你很容易忘记一个依赖。而一个大项目可能需要几分钟的时间来构建。Make会跟踪时间,只重新编译那些必要的东西,这样在开发过程中就不需要等待几分钟了。总结是使生活变得更容易。
jgovgodb6#
通常的方法是使用makefile。它是有用的,因为它被设计为一个工具,正是为了这个目的:-)这就是为什么它也是一个正常的方式.:—)
roejwanj7#
也因为make是2遍,指令的相对顺序无关紧要。在正常的方式中,依赖关系必须手动处理,并且在进行任何更改之前,我们应该始终记住每行的执行顺序。与此形成对比的是,比如说,CFLAGS在最后使用脚本添加到所有makefile。您不需要担心SOURCE和CFLAGS的相对顺序。
7条答案
按热度按时间daolsyd01#
Linux的
normal way
使用makefile。它是从人们手工或用自制脚本编译越来越复杂的应用程序所犯的所有错误中发展出来的。表示复杂项目的构建依赖关系是非常重要的。Make只是提供了一种标准化的方式来指定这种依赖关系,并提供了一个工具来解析依赖关系并运行相关的构建操作。
即使是简化/自动化构建过程的UI,也会在幕后使用make文件或类似的东西。
更新
对于那些想知道汽车评论,这里有两个不同的观点的主题
http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool
http://www.scurrilous.com/blog/archives/2005/08/23/i-hate-automake/的
vc6uscn92#
Makefile为您做了这么多工作,而且常常比人们意识到的更强大。以下面的简单makefile为例
字符串
这是一行代码,并且(至少是gnumake)知道运行
cc -o helloworld helloworld.c
。然后,随着项目的增长,您需要再添加一条规则:型
让他们知道要逃跑
型
然后说你想优化一切。“
型
文件开头处的会处理您的事务。
当项目变大时,make会跟踪已更改和未更改的文件,从而防止无关的、耗时的重新编译。
Makefile是很棒的省时工具,我甚至还没有接触到更高级的食谱。
nbnkbykc3#
因为通常的方式涉及重复,并且很容易输入错误,特别是当命令变得更长、更多,并且出现更多依赖项时。创建一个makefile意味着至少需要运行
make
,然后可选地运行make install
。x759pob24#
makefile很有用,因为(如果定义正确)只允许在进行更改时重新编译所需的内容。
在一个大型项目中,重建程序可能需要一些时间,因为会有许多文件需要编译和链接,并且会有文档,测试,示例等。当你在项目上工作时,你做了一点修改,每次都要等待重建一切,这会很烦人。
一个makefile存储一个列表“输入”文件,“输出”文件和“命令”需要产生给定的输入输出。当您对项目进行更改时,命令
make
将检查输入文件的日期与相应输出文件的日期,如果输入文件已更改,则将通过运行命令重新创建相应的输出。这当然只是一个非常粗略的描述,因为make比这复杂得多(拓扑排序,宏命令,并行执行)。但应该能给予你有所了解
在每次更改时重建所有内容将花费太多时间,并且仅手动重建所需的内容容易出错(如果您忘记重建某个部分,则可能最终会认为您所做的更改是可以的,而实际上它正在破坏您根本没有重新编译的内容)。
请注意,现在有很多比makefile复杂得多的构建系统(例如,通过分析平台和源代码自动生成makefile)。
这些工具是一颗银还是一个寻找问题的解决方案是值得怀疑的(我对此有偏见,因为我讨厌构建工具,他们也讨厌我……)不知何故,他们的自动检测逻辑在我的机器上从来没有正确工作过)。
cyvaqqii5#
复杂性和时间。一个中/大规模项目包含数百个文件和数百个依赖项。你想把它们都记住吗手动构建项目时很容易出错。你很容易忘记一个依赖。而一个大项目可能需要几分钟的时间来构建。Make会跟踪时间,只重新编译那些必要的东西,这样在开发过程中就不需要等待几分钟了。
总结是使生活变得更容易。
jgovgodb6#
通常的方法是使用makefile。
它是有用的,因为它被设计为一个工具,正是为了这个目的:-)这就是为什么它也是一个正常的方式.:—)
roejwanj7#
也因为make是2遍,指令的相对顺序无关紧要。
在正常的方式中,依赖关系必须手动处理,并且在进行任何更改之前,我们应该始终记住每行的执行顺序。与此形成对比的是,比如说,CFLAGS在最后使用脚本添加到所有makefile。您不需要担心SOURCE和CFLAGS的相对顺序。