例1:
CC = gcc
CFLAGS = -Wall -o -g
OBJFLAGS = -Wall -c -g
all: seqlisttest1 seqlisttest2
.PHONY: all
seqlisttest1: seqlisttest1.o seqlist.o compare.o common.o
$(CC) $(CFLAGS) seqlisttest1 seqlisttest1.o seqlist.o compare.o common.o
seqlisttest2: seqlisttest2.o seqlist.o compare.o common.o
$(CC) $(CFLAGS) seqlisttest2 seqlisttest2.o seqlist.o compare.o common.o
seqlisttest1.o: seqlisttest1.c common.h seqlist.h
$(CC) $(OBJFLAGS) seqlisttest1.c
seqlisttest2.o: seqlisttest2.c common.h seqlist.h
$(CC) $(OBJFLAGS) seqlisttest2.c
seqlist.o: seqlist.c common.h seqlist.h compare.h
$(CC) $(OBJFLAGS) seqlist.c
common.o: common.c common.h
$(CC) $(OBJFLAGS) common.c
compare.o: compare.c compare.h
$(CC) $(OBJFLAGS) compare.c
.PHONY: clean
clean:
rm *.o
因为"rm"命令并不产生"clean"文件,则每次执行"make
clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会
执行;为避免这个问题,可使用".PHONY"指明该目标。
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序
make seqlisttest1 单独编译seqlisttest1可执行文件
make seqlisttest2 单独编译seqlisttest2可执行文件
make all 编译seqlisttest1和seqlisttest2可执行文件
make clean 删除.o文件
例2:
CC = gcc
INCLUDE = .
CFLAGS = -c -g -Wall
OBJS = test.o avg.o sum.o
all: test
test: $(OBJS)
$(CC) $^ -o $@
$^: 扩展为整个依赖文件的列表---$(OBJS)
# $@: 扩展为当前规则的目标文件---test
test.o: test.c score.h
$(CC) -I $(INCLUDE) $(CFLAGS) test.c score.h
avg.o: avg.c score.h
$(CC) -I $(INCLUDE) $(CFLAGS) $< -o $@
# $<: 扩展为当前规则依赖文件列表中的第一个依赖文件---avg.c
#
sum.o: sum.c score.h
$(CC) -I $(INCLUDE) $(CFLAGS) $< -o $@
.PHONY: clean
clean:
rm $(OBJS)
$@: 扩展为当前规则的目标文件
$<: 扩展为当前规则依赖文件列表中的第一个依赖文件
$?: 扩展为所有的修改日期比当前规则目标文件的创建日期更晚的依赖文件,该值只有在使用显示规则的
时候才会使用。
$*: 扩展成当前规则中目标文件和依赖文件共享的文件名,不含扩展名
$^: 扩展为整个依赖文件的列表(除了所有重复的文件名)
注意:使用gcc命令查看依赖关系
gcc -MM ia_db.c -I include
阅读(1174) | 评论(0) | 转发(0) |