makefile的小问题

下面的makefile为什么可以正确执行? 我的疑问在这两行:
a:b
$(CC) -c $< $(CFLAGS)
为什么目标和依赖可以随便写?
我的环境是ubuntu 11.10, gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5),GNU Make 3.81


ad@ubuntu:~/pro/base$ l
base.c makefile
ad@ubuntu:~/pro/base$ cat base.c

#include <gtk/gtk.h>

int main(int argc,char * argv[])
{
GtkWidget * window;
gtk_init(&argc,&argv);
window =gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);
gtk_main();

return 0;
}
ad@ubuntu:~/pro/base$ cat makefile
# Target, compiler and objects.
EXEC = base
CC = gcc
OBJ = base.o

# Use for compile.
CFLAGS = `pkg-config --cflags gtk+-2.0`
# Use for link.
CLIBS = `pkg-config --libs gtk+-2.0`

$(EXEC): $(OBJ)
$(CC) -o $@ $^ $(CLIBS)


a:b
$(CC) -c $< $(CFLAGS)


.PHONY:clean
clean:
rm *.o

ad@ubuntu:~/pro/base$ make
gcc `pkg-config --cflags gtk+-2.0` -c -o base.o base.c
gcc -o base base.o `pkg-config --libs gtk+-2.0`
ad@ubuntu:~/pro/base$ l
base* base.c base.o makefile
ad@ubuntu:~/pro/base$ make clean
rm *.o
ad@ubuntu:~/pro/base$ l
base* base.c makefile
ad@ubuntu:~/pro/base$ ./base
^C
ad@ubuntu:~/pro/base$ 

多谢,我是linux开发新手。

作者: dungeonsnd   发布时间: 2011-01-23

看上去那两句没有意义,你去掉就可以了

作者: guosha   发布时间: 2011-01-23

哦,不对,我看错了。为什么可以这么写我也不知道了,呵呵。
引用 1 楼 guosha 的回复:
看上去那两句没有意义,你去掉就可以了

作者: guosha   发布时间: 2011-01-23

引用 2 楼 guosha 的回复:

哦,不对,我看错了。为什么可以这么写我也不知道了,呵呵。
引用 1 楼 guosha 的回复:
看上去那两句没有意义,你去掉就可以了


我测试发现,不管如何写都可以编译运行正确。
并且 make程序执行的编译命令是

a:b
$(CC) -c $< $(CFLAGS)
-----------------------------------------------------
gcc `pkg-config --cflags gtk+-2.0` -c -o base.o base.c

我把78页的陈皓的《跟我一起写makefile》仔细的查阅两遍(没细致从头到尾学),没发现这些,倒是明白 $<代表依赖项的第一个文件,也就是
a:b c 
  gcc -c $<
代表
  gcc -c b 
 
可为什么,顶楼中的makefile为什么不管a:b那行怎么写都可以? 我觉得不是 $< 的缘故吧? 难道能自动识别成 base.c?

作者: dungeonsnd   发布时间: 2011-01-23