Makefile默认行为

时间:2014-11-06 05:14:03

标签: c makefile

我刚刚开始查看make文件,但不确定make文件的默认行为(运行命令make with without parameters)是什么时候1之后的目标不是第1个的依赖。

myprogram: main.o foo.o
    gcc -o myprogram main.o foo.o

main.o: main.c foo.h
    gcc -c main.c

foo.o: foo.c foo.h
    gcc -c foo.c

main2.o: main2.c foo2.h
    gcc -c main2.c

foo2.o: foo2.c foo2.h
    gcc -c foo2.c

从上面开始,如果我要运行make并更新文件main2.cfoo2.c,那么命令gcc -c main2.cgcc -c foo2.c都会运行吗?

2 个答案:

答案 0 :(得分:3)

在您的示例中,main2.ofoo2.o不会更新。这是因为它们不需要myprogram default target,因为它是文件中的第一个目标,并且没有使用.DEFAULT指定默认目标。

没有目标的

make会使特定目标.DEFAULT定义目标,如果未指定目标,则会使指定的first target或默认目标{{3} }}

答案 1 :(得分:0)

伪目标是一个实际上不是文件名的目标;相反,它只是在您发出明确请求时要执行的配方的名称。使用虚假目标有两个原因:避免与同名文件冲突,并提高性能。

.PHONY=all

//line below might not be necessary to your program but here are some flags

OPTS=-g -std=gnu99 -pedantic -Wall -Werror

all:    $(OBJS)

myprogram:    main.o foo.o
        gcc -o myprogram $(OPTS) main.o foo.o

main.o:      main.c foo.h
        gcc -c $(OPTS) main.c

foo.o:      foo.c foo.h
        gcc -c $(OPTS) foo.c

main2.o:        main2.c foo2.h
        gcc -c $(OPTS) main2.c

foo2.o: foo2.c foo2.h
        gcc -c $(OPTS) foo2.c

clean:  
        rm -f *.o $(OBJS)