2010-03-16 81 views
7

例如在

$(CC) $(CFLAGS) -c -o [email protected] $< 

它们意味着什么?

+3

你在'make'上读过哪些文档? http://www.makelinux.net/make3/make3-CHP-1-SECT-5.html? http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_makefiles.html? Anytthing? – 2010-03-16 14:51:52

回答

3

[email protected]正在建设目标的名称 - 正在创建的程序或目标文件。

$<使其重建的文件的名称是文件'其存在允许为目标选择推理规则'的文件的名称。

在这个例子中,你可能有:

program.o: program.c 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

在这种情况下,[email protected]是 'program.o' 和$<是 'program.c'。 (由于“-c”选项,该规则必须生成目标文件。)

要小心'$ <';如果有一个比程序更新的标题,'$ <'会改为匹配 - 然后编译行将不起作用。如图所示,虽然它足够安全。关于 '$ <'


贝塔评论...

的 '制作' 的定义POSIX说:

  • $<

    在推理规则中, $ <宏应评估为其存在允许推断的文件名规则被选为目标。在.DEFAULT规则中,$ <宏应评估为当前目标名称。其他未指定$ <宏的含义。

    例如,在.c.a推理规则中,$ <代表先决条件.c文件。

所以,我给的例子, '$ <' 在技术上是 '未指定'。而且,在正确的背景下, 具体做法是:

.c.o: 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

然后 '$ <' 无条件 'progname.c' 当 'progname.o' 正在建设中。

'make'的某些版本曾经用它来做奇怪的事情; GNU Make(3.81)和Solaris 10似乎都表现得很健全。我怀疑是因为时间扭曲而陷入困境。我用下面的Makefile:

all: x.o 

x.o: x.c 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

x.o: x.h 

我用 'echo "int main(){return 0;}" > x.c' 和 'echo > x.h' 创建的代码。从'x.c'和'x.h'中触发哪个文件并不重要;无论哪种方式,汇编都是“正确的”。我有一个旧的衍生产品,大约在1992年,它与大多数时间的Sun MAKE都兼容,它错误地处理了它。

第七版UNIX程序员手册说:

的规则以创建后缀文件S2依赖于类似命名的文件,后缀S1指定 作为一个条目“目标's1s2。在这样的条目中,特殊的宏$ *代表目标名称,其中后缀名已删除 ,完整目标名称为$ @,需要完整列表的$ <,以及$?对于过期的先决条件列表 。

它没有说任何关于它的含义。我注意到,第7版'make'会列出'$ c $'和'x.h'为'$ <' - 但POSIX表示这是不正确的。

太阳“让用户指南”(16修订版A 1987年3月)说:

$<依赖文件的名称,因为如果选择通过make为使用一个隐含的规则。

或多或少符合您现在看到的内容。


唉,这就是生活;事物在你周围变化。有时你发现它发生了;有时候你没有。

+1

这是不正确的,$ <是列表中的第一个依赖项,不一定是导致目标被重建的依赖项。 – Beta 2010-03-16 15:24:03

+1

P.S. $?是比目标(或PHONY)更新的先决条件列表,所以这些会导致这个目标被重新制作。 – Beta 2010-03-16 15:28:45

+0

@贝塔:好的 - 我认为,我已经通过一些历史评论解决了问题。 – 2010-03-16 17:41:30