提问人:Leo 提问时间:2/15/2023 更新时间:2/15/2023 访问量:57
对 Makefile 中的“-include”模式规则感到困惑
Confused about "-include" pattern rule in Makefile
问:
A1_SRC
并定义我将编译的源代码 C。 并共享相同的标头和 .我在下面附上我的 Makefile:A2_SRC
A1_SRC
A2_SRC
const.h
var.h
EXEC=../bin
OBJ=../obj
CC=mpicc
CFLAGS=-O3 -Wall -traceback
LFLAGS=-lm -lfftw3 -lstdc++ -lmpi
$(OBJ)/%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(CC) $(CFLAGS) -MM $*.c > $(OBJ)/$*.d
A1_OBJ = $(A1_SRC:%.c=$(OBJ)/%.o)
A2_OBJ = $(A2_SRC:%.c=$(OBJ)/%.o)
A1_SRC = \
test.c \
alloc.c \
func.c
A2_SRC = \
test1.c \
test2.c
A1: $(A1_OBJ) const.h var.h
$(CC) $(LFLAGS) $(A1_OBJ) -o $(EXEC)/test_A1
A2: $(A2_OBJ) const.h var.h
$(CC) $(LFLAGS) $(A2_OBJ) -o $(EXEC)/test_A2
all: A1 A2
.PHONY: clean
clean:
rm -f $(OBJ)/*.o $(OBJ)/*.d $(EXEC)/*
install: clean all
-include $(A1_OBJ:$(OBJ)/.o=$(OBJ)/.d) $(A2_OBJ:$(OBJ)/.o=$(OBJ)/.d)
传统上,我们以一种简单的方式定义一个模式规则来从代码编译文件。在这个 Makefile 中,.o
.c
$(CC) -c $(CFLAGS) $< -o $@
, ,A1_OBJ = $(A1_SRC:%.c=$(OBJ)/%.o)
A2_OBJ = $(A2_SRC:%.c=$(OBJ)/%.o)
才能实现这个目标。下一步是执行链接生成可执行文件,这是通过
$(CC) $(LFLAGS) $(A1_OBJ) -o $(EXEC)/test_A1
,$(CC) $(LFLAGS) $(A2_OBJ) -o $(EXEC)/test_A2
但是,我不明白为什么它还使用?然后 Makefile 直到最后一行才使用这些文件......最后一行是什么意思,它与文件有什么关系?$(CC) $(CFLAGS) -MM $*.c > $(OBJ)/$*.d
.d
-include $(A1_OBJ:$(OBJ)/.o=$(OBJ)/.d) $(A2_OBJ:$(OBJ)/.o=$(OBJ)/.d)
.o
此外,在此模式规则中:
A1: $(A1_OBJ) const.h var.h
$(CC) $(LFLAGS) $(A1_OBJ) -o $(EXEC)/test_A1
为什么我们需要两条线?我不明白为什么我们应该把第一行放在这里?$(A1_OBJ) const.h var.h
我希望有经验的程序员可以帮助回答我的问题。这将帮助更多与我有同样疑问的人找到解决方案。
答: 暂无答案
上一个:对数轴大刻度和小刻度
评论
-include
-MM
xyz.d
xyz.c
xyz.d
-include
all
A1
A2
make
A1