我正在尝试编写一个makefile
来构建我的程序的一个release
或版本(版本选择将基于环境变量)。debug
makefile
我的第一次尝试如下:
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
在执行之前会在规则中扩展变量,所以,最后,两个规则看起来一样吗?
在这种情况下,最佳做法是什么?
在此先感谢您的帮助。