我正在尝试使用相同的makefile
编写release
来构建我的程序的debug
或makefile
版本(版本选择将基于env变量)。
我的第一次尝试如下:
PROG := myProgram
ifdef DEBUG
BUILD := debug
else
BUILD := release
endif
BIN := $(BUILD)/$(PROG)
SRC := main.c
OBJDIR := $(BUILD)/obj/
OBJ := $(addprefix $(OBJDIR), $(SRC:%.c=%.o))
$(OBJDIR)/%.o: %.c
$(GCC) $(CFLAGS) -o $@ $<
$(BIN): $(OBJ)
$(GCC) $(OBJ) -o $@ $(LDFLAGS)
all: $(BIN)
当我尝试make
我的项目时,我收到以下错误:
make: *** No rule to make target `release/obj/main.o', needed by `release/myProgram'. Stop.
当我按$(OBJDIR)/%.o
替换规则$(BUILD)/obj/%.o
时,make
能够匹配规则并构建我的对象文件。
我很困惑:为什么第一条规则不起作用?
我的理解是make
会在执行前扩展规则中的变量,因此,最终两个规则看起来都一样吗?
在这种情况下,最佳做法是什么?
提前感谢您的帮助。
答案 0 :(得分:0)
你加了一个斜线:
OBJDIR := $(BUILD)/obj/
$(OBJDIR)/%.o: %.c
...
规则(如编写)将与目标release/obj//main.o
匹配,但没有与release/obj/main.o
匹配的规则。
只需删除有问题的斜杠:
OBJDIR := $(BUILD)/obj