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が、オブジェクトターゲットを完全に破棄しているようです。

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 に答える