GCC生成文件依赖项生成路径

GCC生成文件依赖项生成路径,gcc,makefile,Gcc,Makefile,我在GCC中使用-MM标志为对象生成makefile依赖项。生成文件大致如下所示: -include autodep ... $(TARGET): build $(OBJECTS) $(CC) -shared -o $@ $(OBJECTS) $(CC) -MM $(SOURCES) > autodep 源位于文件夹src中。但是,autodep文件将包含没有相对路径的对象目标: foo.o: src/foo.c src/foo.h bar.o: src/bar.c sr

我在GCC中使用-MM标志为对象生成makefile依赖项。生成文件大致如下所示:

-include autodep
...
$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)
    $(CC) -MM $(SOURCES) > autodep
源位于文件夹src中。但是,autodep文件将包含没有相对路径的对象目标:

foo.o: src/foo.c src/foo.h
bar.o: src/bar.c src/bar.h src/baz.h
我应该如何将它们变成这样:

src/foo.o: src/foo.c src/foo.h
src/bar.o: src/bar.c src/bar.h src/baz.h
?

我尝试使用-MT标志,但它似乎完全放弃了对象目标。

-MT设置了整个目标名称。如果希望每个源都有不同的目标,那么每个源都需要一个不同的-MT参数,这意味着要多次调用编译器和foreach循环:

$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)
    rm autodep
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;)
或者,您可以使用sed来按摩输出

$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep
更简单的方法是将每个源文件的依赖项放入它自己的.d文件中,并在编译源文件时使用-MMD标志生成该依赖项:

-include $(SOURCES:.c=.d)
CFLAGS += -MMD

$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)
谢谢我使用了foreach循环,现在autodep的内容是正确的。但它实际上似乎不起作用。使用问题中的示例,如果我更改src/bar.h并运行make,我只会得到make:`src/foo.o'是最新的。通过将-include放在后面解决了这个问题:。