GCC makefile 依赖项生成路径

5
我使用GCC中的-MM标识来为对象生成makefile依赖项。生成的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标志,但它似乎完全丢弃了目标对象。

1个回答

6

-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'已经是最新的 - Avidan Borisov
通过将-include放在all:之后解决了这个问题。 - Avidan Borisov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接