我为这个含糊不清的标题道歉,由于我对GNU make缺乏了解,我想不出一个简单的方法来表达它。
我正在为一个小项目编写一个简单的Makefile,我试图通过使用它们的基本名称(没有路径)作为目标来生成单个对象:
$(BASE_OBJS) : %.o : $(SRC_DIR)/%.c $(OBJDIR) $(INCLUDES)
@echo $(CC): [$(notdir $<)] '->' [$(notdir $@)]
@$(CC) -c $< $(CFLAGS) -o $(OBJDIR)/$@
问题是'make'应用显然希望目标对象出现在当前文件夹中,但它实际上存在于$(OBJDIR)子文件夹中。导致这些目标不必要地重建。
或者,此规则会检查对象是否存在于正确的位置:
$(OBJS) : $(OBJDIR)/%.o: $(SRC_DIR)/%.c $(INCLUDES)
@echo $(CC): [$(notdir $<)] '->' [$(notdir $@)]
@$(CC) -c $< $(CFLAGS) -o $@
但它不能用于运行像'make main.o'这样的东西,因为$(OBJS)包含了对象的完整路径,所以它只允许'make output / main.o'这样的东西。 / p>
如果它是重复的那么我很抱歉,我正在寻找一段时间而无法找到类似的问题。
作为参考,这些是变量定义:
BASE_SRC=$(notdir $(SOURCES))
BASE_OBJS = $(BASE_SRC:%.c=%.o)
OBJS = $(BASE_OBJS:%.o=$(OBJDIR)/%.o)
答案 0 :(得分:1)
您的主要目标和先决条件必须使用完整路径,因为这就是make的工作方式。所以你必须有类似的东西:
$(OBJS) : $(OBJDIR)/%.o: $(SRC_DIR)/%.c $(INCLUDES)
@echo $(CC): [$(notdir $<)] '->' [$(notdir $@)]
@$(CC) -c $< $(CFLAGS) -o $@
现在如果另外你希望能够运行一个简单的make foo.o
,那么你应该为真实目标定义额外的“别名”目标。这些规则只适用于短手,它们实际上并没有做任何事情。类似的东西:
$(BASE_OBJS) : %.o : $(OBJDIR)/%.o