Make 不编译好的文件
Make does not compile good files
我的 Makefile 有问题,它只是编译同一个文件很多次。
这是我的文件:
$ 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 $@ $(FLAGS) $(ELIB)
$(OBJY) : $(SRCY)
@echo $<
@$(YACC) -d $<
@$(CC) -c y.tab.c -o $@
$(OBJL) : $(SRCL)
@echo $<
@$(LEX) $<
@$(CC) -c lex.yy.c -o $@
$(OBJ) : $(SRC)
@echo $<
$(CC) -c $< -o $@ $(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
这是我执行 'make':
时的输出
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' 文件,我不明白为什么!
感谢您的帮助,
幻影
SRC = $(shell find struct/ -name "*.c")
您在这里创建一个列表,$(SRC)
将是 struct/struct.c struct/carnet.c struct/ihm.c
。或者任何其他顺序 find
可能 return,但根据您的结果,这似乎是顺序。
OBJ = $(SRC:.c=.o)
这将创建修改后的列表 struct/struct.o struct/carnet.o struct/ihm.o
$(OBJ) : $(SRC)
@echo $<
$(CC) -c $< -o $@ $(FLAGS)
我们开始吧,(部分,为清楚起见)扩展导致
struct/struct.o struct/carnet.o struct/ihm.o : struct/struct.c struct/carnet.c struct/ihm.c
@echo $<
$(CC) -c $< -o $@ $(FLAGS)
因此,您应用了用于构建 3 个目标的规则,没问题。现在,$<
扩展到 第一个 先决条件,这里是 struct/struct.c
。
一个可能的(也是常见的)解决方案,如果你使用 make
能够做到这一点,例如GNU make, 就是用模式规则代替这个find
-hack:
struct/%.o : struct/%.c
@echo $<
$(CC) -c $< -o $@ $(FLAGS)
请注意,通常情况下,您只需在 Makefile
中维护目标文件的一个模块列表,通常是手动的目标文件,如下所示:
OBJS:= struct/struct.o struct/carnet.o struct/ihm.o
我的 Makefile 有问题,它只是编译同一个文件很多次。
这是我的文件:
$ 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 $@ $(FLAGS) $(ELIB)
$(OBJY) : $(SRCY)
@echo $<
@$(YACC) -d $<
@$(CC) -c y.tab.c -o $@
$(OBJL) : $(SRCL)
@echo $<
@$(LEX) $<
@$(CC) -c lex.yy.c -o $@
$(OBJ) : $(SRC)
@echo $<
$(CC) -c $< -o $@ $(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
这是我执行 'make':
时的输出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' 文件,我不明白为什么!
感谢您的帮助, 幻影
SRC = $(shell find struct/ -name "*.c")
您在这里创建一个列表,$(SRC)
将是 struct/struct.c struct/carnet.c struct/ihm.c
。或者任何其他顺序 find
可能 return,但根据您的结果,这似乎是顺序。
OBJ = $(SRC:.c=.o)
这将创建修改后的列表 struct/struct.o struct/carnet.o struct/ihm.o
$(OBJ) : $(SRC)
@echo $<
$(CC) -c $< -o $@ $(FLAGS)
我们开始吧,(部分,为清楚起见)扩展导致
struct/struct.o struct/carnet.o struct/ihm.o : struct/struct.c struct/carnet.c struct/ihm.c
@echo $<
$(CC) -c $< -o $@ $(FLAGS)
因此,您应用了用于构建 3 个目标的规则,没问题。现在,$<
扩展到 第一个 先决条件,这里是 struct/struct.c
。
一个可能的(也是常见的)解决方案,如果你使用 make
能够做到这一点,例如GNU make, 就是用模式规则代替这个find
-hack:
struct/%.o : struct/%.c
@echo $<
$(CC) -c $< -o $@ $(FLAGS)
请注意,通常情况下,您只需在 Makefile
中维护目标文件的一个模块列表,通常是手动的目标文件,如下所示:
OBJS:= struct/struct.o struct/carnet.o struct/ihm.o