Makefile头依赖项

时间:2013-03-31 02:38:26

标签: makefile

我是使用make的新手,并且通过this tutorial学习了基础知识。这是教程中最后一个示例makefile示例:

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

这应该可以正常工作,假设所有.c文件都只包含hellomake.h,但如果每个.c文件包含不同的标题,它将无法正常工作。是否可以编写一个知道每个.c文件包含什么的makefile,所以我不必像以下那样手动执行:

foo.o: foo.c something.h
    ...

bar.o: bar.c somethingelse.h
    ...

因为这似乎是浪费时间。

3 个答案:

答案 0 :(得分:13)

假设foo.c有一行:

#include "something.h"

你喜欢makefile中的一行:

foo.o: foo.c something.h

gcc编译器可以为您构建该行。命令

gcc -MMD -c -o foo.o foo.c

将构建包含该行的foo.ofoo.d。 (试试吧。)

所以只需修改你的makefile来生成这些* .d文件并包含它们,你就完成了:

$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -MMD -c -o $@ $< $(CFLAGS)

-include $(ODIR)/*.d

(可以进一步改进,例如指定* .d文件的位置。)

答案 1 :(得分:0)

传统品牌相当有限,迫使你自己做所有基本的东西。如果您正确地希望构建工具能够找到依赖关系并知道要链接的内容,请尝试makepp。您可能根本不需要makefile,或者只需要一个像

这样的最小文件
CFLAGS = -O3
myprog:                # just a default target to know what to build

链接部分需要您的帮助,因为它基于源头对。如果myprog.cpp包含a.hb.hpp,则会查看是否可以构建a.o和/或b.o,如果是,则会链接它们并递归检查它们的来源包括什么。

如果您有更复杂的要求,您只需要学习更多make语法。但如果你这样做,就没有限制。除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。

答案 2 :(得分:0)

是的,&#34; MMD&#34; flag会帮助你生成&#34; .d&#34;文件(依赖)文件。如果在Makefile的末尾包含(-include * .d),然后在.h文件中进行任何更改,则相应的.o文件将重建。

以此为参考: https://github.com/saanvijay/makefile-skeleton