我想为编译器编写一个(gmake)makefile - 与gcc不同 - 将所有输出文件放入特定目录。不幸的是,这种行为无法改变。
我的来源位于多个目录中。如何编写允许我编译源代码的模式规则。
好的,这有点不清楚。这是一个例子。我的消息来源看起来可能是这样的:
./folder1/foo.c
./folder2/bar.c
并且输出文件最终会像这样结束:
./obj/foo.obj
./obj/bar.obj
我的规则如何编译我的源代码?
%.obj : %.c
$(COMPILER) -c $<
不起作用。
有什么想法吗?我想避免每个源文件的隐式规则......
答案 0 :(得分:24)
从我的一些Makefile中提取:
OBJS := $(sort $(patsubst %.cpp,$(OBJECT_DIRECTORY)/%.o,$(patsubst %.c,$(OBJECT_DIRECTORY)/%.o,$(notdir $(SRCS)))))
其中OBJECT_DIRECTORY
指向对象目录,SRCS
是源文件列表(您甚至可以使用$(wildcard)
填充)。
然后在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))))