0

我正在尝试编写一个makefile来构建我的程序的一个release或版本(版本选择将基于环境变量)。debugmakefile

我的第一次尝试如下:

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/%.omake能够匹配规则并构建我的对象文件。

我很困惑:为什么第一条规则不起作用?我的理解是make在执行之前会在规则中扩展变量,所以,最后,两个规则看起来一样吗?

在这种情况下,最佳做法是什么?

在此先感谢您的帮助。

4

1 回答 1

0

你加了一个额外的斜线:

OBJDIR := $(BUILD)/obj/


$(OBJDIR)/%.o: %.c
    ...

所写的规则将匹配目标release/obj//main.o,但没有匹配的规则release/obj/main.o

只需删除有问题的斜线:

OBJDIR := $(BUILD)/obj
于 2013-06-07T11:27:12.727 回答