2014-11-06 76 views
0

我刚刚开始查看make文件,但不确定make文件的默认行为(运行命令不带参数的情况下)是在1st之后的目标不是1st的依赖项时。Makefile默认行为

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都运行?

+0

你的'Makefile'很丑。也许适应[这个例子](http://stackoverflow.com/a/20146082/841108)到您的需要 – 2014-11-06 05:57:07

+0

不会*尝试它*比发布问题更容易? – Beta 2014-11-06 06:03:13

+1

只有命令行上没有指定特定目标时,才会处理make文件中的第一个目标。为了获得所有要处理的目标,当没有给出特定的目标时,然后在任何其他目标之前插入行:SRC =(通配符* .c)然后OBJ =($(SRC):.c:.o)然后INC =($(SRC):.c:.h)然后第一个目标(通常名为'all')all:myprogram $(OBJ)makefile – user3629249 2014-11-06 06:49:25

回答

3

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

make没有目标,使通过特殊目标.DEFAULT定义的目标,如果没有指定目标,那么它使得在指定或默认,makefile发现first target

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)