2015-08-15 72 views
1

我遇到了一个Makefile的问题,它只是编译了很多次相同的文件。Make不编译好文件

这里是我的文件:

$ ls * 
carnet.data carnet.l carnet.y Makefile 

struct: 
carnet.c carnet.h ihm.c ihm.h struct.c struct.h 

这里是我的Makefile:

CC  = gcc 
LEX  = lex 
YACC = yacc 
FLAGS = -Wall -Wextra -Werror -O3 -g 
ELIB = -lfl # Flex library 
TARGET = carnet 

SRC  = $(shell find struct/ -name "*.c") 
OBJ  = $(SRC:.c=.o) 
SRCL = $(shell find -name "*.l") 
OBJL = lex.yy.o 
SRCY = $(shell find -name "*.y") 
OBJY = y.tab.o 

all : $(TARGET) 

$(TARGET) : $(OBJ) $(OBJY) $(OBJL) 
    @echo "Linking" 
    @echo $(SRC) 
    @echo $(OBJ) 
    @$(CC) $^ -o [email protected] $(FLAGS) $(ELIB) 


$(OBJY) : $(SRCY) 
    @echo $< 
    @$(YACC) -d $< 
    @$(CC) -c y.tab.c -o [email protected] 

$(OBJL) : $(SRCL) 
    @echo $< 
    @$(LEX) $< 
    @$(CC) -c lex.yy.c -o [email protected] 

$(OBJ) : $(SRC) 
    @echo $< 
    $(CC) -c $< -o [email protected] $(FLAGS) 

clean : 
    rm y.tab.c $(OBJY) y.tab.h lex.yy.c $(OBJL) 
    rm $(OBJ) 

destroy : 
    rm $(TARGET) 

rebuilt : destroy mrpropper 

mrpropper : all clean 

这里是输出,当我做一个 '让':

struct/struct.c 
gcc -c struct/struct.c -o struct/struct.o -Wall -Wextra -Werror -O3 -g 
struct/struct.c 
gcc -c struct/struct.c -o struct/carnet.o -Wall -Wextra -Werror -O3 -g 
struct/struct.c 
gcc -c struct/struct.c -o struct/ihm.o -Wall -Wextra -Werror -O3 -g 
carnet.y 
carnet.l 
Linking 
struct/struct.c struct/carnet.c struct/ihm.c 
struct/struct.o struct/carnet.o struct/ihm.o 

我们可以看到,当我执行'echo $(SRC)'时,他发现所有三个文件,但他只编译'struct.c'文件,我不明白为什么!

感谢您的帮助, 幻影

+0

旁注没有真正属于我的回答:使用':='的,而不是'='无处不在,你不需要*后期扩展*,以避免混乱。只用'=',你会得到一个变量,它的内容只有在扩展时才会扩展,大部分时间,这不是你想要的(但有时候是这样) –

回答

2
SRC  = $(shell find struct/ -name "*.c") 

您在这里创建一个列表,$(SRC)struct/struct.c struct/carnet.c struct/ihm.c。或者任何其他订单find可能会返回,但根据您的结果,这似乎是顺序。

OBJ  = $(SRC:.c=.o) 

这将创建修改列表struct/struct.o struct/carnet.o struct/ihm.o

$(OBJ) : $(SRC) 
    @echo $< 
    $(CC) -c $< -o [email protected] $(FLAGS) 

在这里,我们走了,(部分,为清楚起见)扩张导致

struct/struct.o struct/carnet.o struct/ihm.o : struct/struct.c struct/carnet.c struct/ihm.c 
    @echo $< 
    $(CC) -c $< -o [email protected] $(FLAGS) 

所以,你已经申请了建设3个目标的规则,很好。现在,$<扩展到第一个先决条件,这里是struct/struct.c这里。

如果您使用的是make(例如, GNU使,是使用模式的规则,而不是这个find -hack:

struct/%.o : struct/%.c 
    @echo $< 
    $(CC) -c $< -o [email protected] $(FLAGS) 

注意,通常情况下,你只是保持你的taget的模块中的一个列表中你Makefile,通常的目标文件,手动,喜欢这里:

OBJS:= struct/struct.o struct/carnet.o struct/ihm.o 
+0

我希望'$(SRC) '像'%.c':s谢谢;) – Phantom