• 全部
...

~~make与makefile有什么区别

宵怀 2012-07-21 07:23:51

最近,
好纠结。。

以下,我在unix编程艺术中看到的:
很多常用的典型makefile中根本没有文件依赖关系。它们是将某些开发者想要自动化的小过程捆绑在一起的方法。
接下来,书上引用了Stuatr Feldman的话:
生成目标非文件,这早已有之。“make all” 和“clean”是早些日子我自己的习惯。有一个老Unix笑话,输入“make love”,输出是“Don't know how to make love”。

还看了一篇叫《和我一起学makefile》的文章,
可是,大体地看完这些,都不明白,makefile究竟是在项目中起着什么作用,又是怎么使用的。

makefile与make都有“make”,但是,make与makefile有什么区别呢。??

...全文
给本帖投票
821 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
宵怀 2012-07-25
  • 打赏
  • 举报
回复
七、静态模式

静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活
。我们还是先来看一下语法:

<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...


targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。

target-parrtern是指明了targets的模式,也就是的目标集模式。

prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目
标的定义。


这样描述这三个东西,可能还是没有说清楚,还是举个例子来说明一下吧。如果我们的<t
arget-parrtern>定义成“%.o”,意思是我们的<target>集合中都是以“.o”结尾的,而
如果我们的<prereq-parrterns>定义成“%.c”,意思是对<target-parrtern>所形成的目
标集进行二次定义,其计算方法是,取<target-parrtern>模式中的“%”(也就是去掉了
[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。

所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果你的文件名
中有“%”那么你可以使用反斜杠“\”进行转义,来标明真实的“%”字符。

看一个例子:

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@


上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的
目标,也就是“foo.o bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取
模式“%.o”的“%”,也就是“foo bar”,并为其加下“.c”的后缀,于是,我们的依赖
目标就是“foo.c bar.c”。而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有
的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”
)。于是,上面的规则展开后等价于下面的规则:

foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o

试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就可
以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那
会一个很强大的功能。再看一个例子:


files = foo.elc bar.o lose.o

$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<


$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$filter”集,只要其中
模式为“%.o”的内容。其的它内容,我就不用多说了吧。这个例字展示了Makefile中更大
的弹性。





求解makefile的静态模式;;;
宵怀 2012-07-25
  • 打赏
  • 举报
回复
七、静态模式

静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活
。我们还是先来看一下语法:

<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...


targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。

target-parrtern是指明了targets的模式,也就是的目标集模式。

prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目
标的定义。


这样描述这三个东西,可能还是没有说清楚,还是举个例子来说明一下吧。如果我们的<t
arget-parrtern>定义成“%.o”,意思是我们的<target>集合中都是以“.o”结尾的,而
如果我们的<prereq-parrterns>定义成“%.c”,意思是对<target-parrtern>所形成的目
标集进行二次定义,其计算方法是,取<target-parrtern>模式中的“%”(也就是去掉了
[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。

所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果你的文件名
中有“%”那么你可以使用反斜杠“\”进行转义,来标明真实的“%”字符。

看一个例子:

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@


上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的
目标,也就是“foo.o bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取
模式“%.o”的“%”,也就是“foo bar”,并为其加下“.c”的后缀,于是,我们的依赖
目标就是“foo.c bar.c”。而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有
的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”
)。于是,上面的规则展开后等价于下面的规则:

foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o

试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就可
以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那
会一个很强大的功能。再看一个例子:


files = foo.elc bar.o lose.o

$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<


$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$filter”集,只要其中
模式为“%.o”的内容。其的它内容,我就不用多说了吧。这个例字展示了Makefile中更大
的弹性。





求解makefile的静态模式;;;
宵怀 2012-07-24
  • 打赏
  • 举报
回复
make是解析器?
cao_julians 2012-07-23
  • 打赏
  • 举报
回复
导演====make
剧本====makefile
演员====MAKE调用的外部命令,如编译器、链接器等

电影====生成的程序
cao_julians 2012-07-23
  • 打赏
  • 举报
回复
越来越形象了。来个更形象的:
make是乐团指挥,
makefile是它看的总谱
总谱中描述了各个乐手(象编译器、链接器等)的演奏分谱

乐园指挥按总谱挥动指挥棒,调度各位乐手演奏(编译器、链接器按序工作),。。。。直到一部乐曲(一个多件源文件、目标文件、库文件生成的程序)诞生
pathuang68 2012-07-23
  • 打赏
  • 举报
回复
make是动词
makefile是名词

makefile中指定了各种依赖规则,编译和链接规则,当运行make的时候,就会自动执行makefile中设定的那些内容。
hhsyxxwl0601 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 12 楼 的回复:
make是应用程序,以makefile所定义的规则去执行,可以编译和链接代码,可以调用外部命令。


其实看完上面的解说后,我可以明白make和makefile是怎么一回事了,

是不是这样的呢:
makefile其实是一个文本文件,
而make其实是执行该文本文件。


???
[/Quote]
可以这样理解
宵怀 2012-07-23
  • 打赏
  • 举报
回复

[Quote=引用 12 楼 的回复:]
make是应用程序,以makefile所定义的规则去执行,可以编译和链接代码,可以调用外部命令。
[/Quote]

其实看完上面的解说后,我可以明白make和makefile是怎么一回事了,

是不是这样的呢:
makefile其实是一个文本文件,
而make其实是执行该文本文件。


???
图灵狗 2012-07-23
  • 打赏
  • 举报
回复
make是应用程序,以makefile所定义的规则去执行,可以编译和链接代码,可以调用外部命令。
宵怀 2012-07-23
  • 打赏
  • 举报
回复

[Quote=引用 10 楼 的回复:]
make是程序,makefile是程序的配置文件……
这就像你玩游戏的时候,双击图标,这个东西就相当与make,是真正可以执行的程序,进入游戏以后,你要读自己的存档,要根据这个存档来继续游戏,这个存档就相当与makefile……
在执行meke的时候,make程序会自动的查找makefile这个文件,如果没有这个文件,make无法执行……
[/Quote]

好形象的说明。。。
夏天__ 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

make是系统提供的一个可执行程序
而makefile是程序员针对自己的开发项目书写的一个文本文件
make解释makefile的内容,按程序员的期望完成编译、链接任务
[/Quote]
宵怀 2012-07-23
  • 打赏
  • 举报
回复

[Quote=引用 20 楼 的回复:]
MakeFile是可以看做是脚本文件,Make是执行程序。
就像你可以将C++看成是一种脚本语言,C++写的程序是脚本程序(对比MakeFile的脚本文件,遵循一定的脚本语言规则),用于解释MakeFile的Make就相当于用于解释C++的g++应用程序。
[/Quote]

make是解释功能的??
宵怀 2012-07-23
  • 打赏
  • 举报
回复

[Quote=引用 18 楼 的回复:]
make是工具,由Makefile驱动。
即你自己在Makefile中写规则,描述文件的依赖关系以及生成方法,然后运行make,指明Makefile和目标,由工具自动生成目标。
[/Quote]

大致了解makefile是如何使用的,
现在,又想知道makefile文件应该放置在项目的哪个地方。???
tanmeining 2012-07-23
  • 打赏
  • 举报
回复
MakeFile是可以看做是脚本文件,Make是执行程序。
就像你可以将C++看成是一种脚本语言,C++写的程序是脚本程序(对比MakeFile的脚本文件,遵循一定的脚本语言规则),用于解释MakeFile的Make就相当于用于解释C++的g++应用程序。
宵怀 2012-07-23
  • 打赏
  • 举报
回复

[Quote=引用 17 楼 的回复:]
导演====make
剧本====makefile
演员====MAKE调用的外部命令,如编译器、链接器等

电影====生成的程序
[/Quote]

嘻嘻,好好理解。。。
ForestDB 2012-07-23
  • 打赏
  • 举报
回复
make是工具,由Makefile驱动。
即你自己在Makefile中写规则,描述文件的依赖关系以及生成方法,然后运行make,指明Makefile和目标,由工具自动生成目标。
子谋 2012-07-22
  • 打赏
  • 举报
回复
make是程序,makefile是程序的配置文件……
这就像你玩游戏的时候,双击图标,这个东西就相当与make,是真正可以执行的程序,进入游戏以后,你要读自己的存档,要根据这个存档来继续游戏,这个存档就相当与makefile……
在执行meke的时候,make程序会自动的查找makefile这个文件,如果没有这个文件,make无法执行……
宵怀 2012-07-22
  • 打赏
  • 举报
回复

[Quote=引用 7 楼 的回复:]
make是系统提供的一个可执行程序
而makefile是程序员针对自己的开发项目书写的一个文本文件
make解释makefile的内容,按程序员的期望完成编译、链接任务
[/Quote]

原来整理一下思路再去看《跟我一起学makefile》,还有点看得明白了。。
谢谢。。。


AnYidan 2012-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
make是系统提供的一个可执行程序
而makefile是程序员针对自己的开发项目书写的一个文本文件
make解释makefile的内容,按程序员的期望完成编译、链接任务
[/Quote]

++
cao_julians 2012-07-21
  • 打赏
  • 举报
回复
make是系统提供的一个可执行程序
而makefile是程序员针对自己的开发项目书写的一个文本文件
make解释makefile的内容,按程序员的期望完成编译、链接任务
加载更多回复(6)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部