说,我有几个源代码,a.c, b.c, ..., z.c
,我想要一个规则来编译它们。这是一个解决方案:
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
然后我介绍了c.h
中使用的标头c.c
,以及e.h
和c.c
中使用的另一个标头e.c
,事情变得复杂了:
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
c.o: c.c c.h e.h
$(CC) -c -o $@ $(CFLAGS) $<
e.o: e.c e.h
$(CC) -c -o $@ $(CFLAGS) $<
根据条件1的解决方案,add_dependency
中是否有make
来简化解决方案并获得类似下面的内容?
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
add_dependency(c.o, c.h e.h)
add_dependency(e.o, e.h)
或者,您认为条件1的更好解决方案是什么?
编辑:
感谢亲切的通知@ctheo :)
是的,我确实看过autotools
,并了解这将满足我的所有需求。然而,我正在处理的是一个现有项目,其Makefile
包含处理C++
中代码的其他指令,我认为现在我最好只修改几行代替将整个Makefile
移植到autotools
,除非在没有引入autotools
的情况下找不到令人满意的解决方案。 :)
答案 0 :(得分:5)
起初我没想到会为此提供解决方案。在我看来它被autotools
覆盖了。但是,经过一些搜索,我找到了GNU / make手册的this section。
它声明:
一个文件可以是多个规则的目标。所有规则中提到的所有先决条件都合并为到目标的一个先决条件列表中。
因此,您的查询有一个解决方案
c.o: c.h e.h
e.o: e.h
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
感谢您的坚持。我今天学到了一些东西:)
答案 1 :(得分:0)
此外,示例中的.o
文件都依赖于具有相同词干的.h
文件,因此您也可以概括该部分规则:
c.o: e.h
%.o: %.c %.h
$(CC) -c -o $@ $(CFLAGS) $<
这样,你的“正常”情境完全由触发编译的规则所涵盖,你的“不寻常”情况脱颖而出,因为这些是唯一的附加规则。