原创:http://blog.sina.com.cn/u/2312748742
在目标或者依赖模式里的 % ,如
objects = foo.o bar.o
all: $(objects)
$(objects): %.o :%.c
all: foo.o bar.o
foo.o:foo.c
bar.o:bar.c
=
左侧是变量,右侧是变量的值,右侧的值可以定义在任何一处,可以在后面定义
:= 同理,但不同的是右侧变量的值需要在定义之前,防止嵌套定义
?= 例如 foo ?=bar 如果foo没有被定义过。则foo为bar ,如果之前被定义过,这条语句将什么都不做。
+= 在追加。
例如:
bar=
foo=$(bar)
ifdef foo
frobozz=yes
else
frobozz=no
endif
此时$(frobozz) 为 yes
foo=
ifdef foo
frobozz=yes
else
frobozz=no
endif
此时$(frobozz) 为 no
一、静态规则:
$(CC) -c $(CFLAGS) $< -o $@
上面的 $(objects),是个变量。相当于 foo.o bar.o ; %.o表示所有的.o文件。即 foo.o bar.o。%.c即是取%.o中的%.即 foo 和bar .因此 %.c 即是 foo.c bar.c。后面的 $< 自动变量,表示依赖文件集合,即是foo.c和bar.c。而$@同理为 foo.o和bar.o
因此 等价于:
$(CC) -c $(CFLAGS) foo.c -o foo.o
$(CC) -c $(CFLAGS) bar.c -o bar.o
二、使用变量
三、判断:
四、加入头文件路径:
在刚开始时加入:
CROSS_COMPILE=arm-none-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc
====》》INCLUDE := -I/workspace/gitspaces/dvsdk/linux-devkit/arm-none-linux-gnueabi/usr/include/
CC = $(CROSS_COMPILE)gcc
====》》INCLUDE := -I/workspace/gitspaces/dvsdk/linux-devkit/arm-none-linux-gnueabi/usr/include/
在all:hwtest 下加入:
.c.o:
$(CC) -O1 -Wall -c $< -o $@ $(INCLUDE)
hwtest: $(OBJS) $(TFTP_OBJS)
$(CC) -o hwtest $(OBJS) $(TFTP_OBJS) $(CFLAGS) $(INCLUDE)