Makefile、模式规则和目录

Makefile、模式规则和目录,makefile,Makefile,我想为编译器编写一个(gmake)makefile,与gcc不同,它将所有输出文件放在一个特定的目录中。不幸的是,这种行为无法改变 我的资源在多个目录中。如何编写模式规则来编译源代码 好吧,这有点不清楚。这里有一个例子。我的资料来源可能如下: ./folder1/foo.c ./folder2/bar.c ./obj/foo.obj ./obj/bar.obj 输出文件将以如下方式结束: ./folder1/foo.c ./folder2/bar.c ./obj/foo.obj ./obj

我想为编译器编写一个(gmake)makefile,与gcc不同,它将所有输出文件放在一个特定的目录中。不幸的是,这种行为无法改变

我的资源在多个目录中。如何编写模式规则来编译源代码

好吧,这有点不清楚。这里有一个例子。我的资料来源可能如下:

./folder1/foo.c
./folder2/bar.c
./obj/foo.obj
./obj/bar.obj
输出文件将以如下方式结束:

./folder1/foo.c
./folder2/bar.c
./obj/foo.obj
./obj/bar.obj
我编译源代码的规则应该是什么样的

%.obj : %.c 
   $(COMPILER) -c $< 
%.obj:%.c
$(编译器)-c$<
这是行不通的


有什么想法吗?我希望避免对每个源文件使用隐式规则…

从我的某个Makefile中提取:

OBJS:=$(sort$(patsubst%.cpp,$(OBJECT\u目录)/%.o,$(patsubst%.c,$(OBJECT\u目录)/%.o,$(notdir$(SRCS '))

其中,
OBJECT\u DIRECTORY
指向对象目录,
SRCS
是源文件列表(您甚至可以使用
$(通配符)
填充源文件)

然后在Makefile中,我有:

define define_compile_rules
$(OBJECT_DIRECTORY)/%.o: $(1)%.c
  @echo " + Compiling '$$<'"
  @mkdir -p $$(@D)
  $(CC) $$(CFLAGS) -o $$@ -c $$<
endef

$(foreach directory,$(sort $(dir $(SRCS))),$(eval $(call define_compile_rules,$(directory))))
define\u compile\u规则
$(对象目录)/%.o:$(1)%.c

@回音“+编译'$$eval和foreach函数是gmake的一个严重不足的功能。可能是因为GNU Make 3.81之前的bug?太棒了。这有点可怕,但仍然非常有用。你可以使用
VPATH
来实现它=或者=你可以创建
folder1/Makefile
obj/Makefile
,它将
包括../Makefile.inc
,其中应该包含通用规则(例如,你给出的规则)。