简单的Makefile

例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"文件,则每次执行"makeclean"的时候,该命令都会执行。如果目录中出现了"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

你可能感兴趣的:(简单的Makefile)