我遇到了一个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'文件,我不明白为什么!
感谢您的帮助, 幻影
旁注没有真正属于我的回答:使用':='的,而不是'='无处不在,你不需要*后期扩展*,以避免混乱。只用'=',你会得到一个变量,它的内容只有在扩展时才会扩展,大部分时间,这不是你想要的(但有时候是这样) –