5

我使用-MMGCC 中的标志来为对象生成 makefile 依赖项。生成文件简要如下所示:

-include autodep
...
$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)
    $(CC) -MM $(SOURCES) > autodep

源位于 in 文件夹中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标志,但它似乎完全丢弃了对象目标。

4

1 回答 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)
于 2013-03-14T22:26:04.303 回答