【发布时间】:2017-06-10 07:57:49
【问题描述】:
我为这个模棱两可的标题道歉,由于我缺乏 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'这样的东西。
如果它是重复的,那么对不起,我找了一段时间,找不到类似的问题。
作为参考,这些是变量定义:
BASE_SRC=$(notdir $(SOURCES))
BASE_OBJS = $(BASE_SRC:%.c=%.o)
OBJS = $(BASE_OBJS:%.o=$(OBJDIR)/%.o)
【问题讨论】:
-
"我正在尝试通过使用它们的基本名称(不带路径)作为目标来生成单个对象" make。无论如何,目标应该是文件,因为这就是
make的工作方式(make从它们的时间戳确定是否必须重新构建这些文件)。你可以有一些“假”目标(通常是all、clean、...),但你真的没有想要通过 phony 目标创建中间对象文件,这意味着每次运行 make 时都要重建它们,即使没有任何改变。 -
我知道目标每次都会被重建,我发布我的问题是为了知道是否有办法防止它发生。关于误用:这是我的第一个想法,但后来我回忆起例如 Linux 内核构建系统允许从主文件夹按名称构建 *.dtb 文件,而无需进行不必要的重建,我认为这里是可能的。