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开发新手。
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 的回复:
看上去那两句没有意义,你去掉就可以了
哦,不对,我看错了。为什么可以这么写我也不知道了,呵呵。
引用 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