2

私はしばらくの間、makefileで自動依存関係を使用しようとしてきましたが、すべてのファイルをルートフォルダーに配置するよりも複雑な構造をプロジェクトに使用しているため、それを機能させるのに苦労しています。

私はmakefileでこのコードを使用してみました:

OBJECTS_DIR = obj/
SRCS_DIR = src/
#source files list, i.e : src/foo.cpp src/bar/foo2.cpp
SOURCES = $(shell find $(SRCS_DIR) -name \*.cpp | xargs -d '\n')
#object files list, i.e : obj/foo.o obj/foo2.o
OBJECTS = $(addprefix $(OBJECTS_DIR), $(notdir $(SOURCES:.cpp=.o)))
DEPS = $(OBJECTS_DIR)make.dep

myproject : $(OBJECTS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

$(OBJECTS) : $(SOURCES)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ -c $(filter %/$(notdir $(@:.o=.cpp)), $(SOURCES))

$(DEPS): $(SOURCES)
    $(CC) -MM  $(SOURCES) > $(DEPS)

-include $(DEPS)

all : myproject

clean :
    @-rm -f $(RELEASE_DIR)* $(OBJECTS_DIR)*

すべての依存関係をobj/make.depファイルに保存したいと思います。これにより、次の出力が得られます(ここで、fooにはfoo2が含まれています)。

foo2.o: src/bar/foo2.cpp src/bar/headers/foo2.h
foo.o: src/foo.cpp src/bar/headers/foo2.h

次の出力を取得するために、各オブジェクトファイルの名前を変更したいと思います。obj/ foo2.o:src / bar / foo2.cpp src / bar / headers / foo2.h obj / foo.o:src/foo。 cpp src / bar / headers / foo2.h

-MTオプションを試してみましたが、結果はありません...さらに、-include $(DEPS)は、作成した依存関係を含めるのに十分ですか?OBJECTルールの$(filter%/ $(notdir $(@ :. o = .cpp))、$(SOURCES))を、make.depファイルに記述された行に置き換えるべきではありませんか?

洞察を事前にありがとう、私のmakefileを強化する他の方法があるかどうか教えてください!

4

2 に答える 2

1

すべての依存関係を 1 つのファイルに保存する理由は何ですか? 通常、各オブジェクト ファイルには、コンパイル中に作成される独自の .d ファイルがあり、それが .d ファイルです-include。その場合、最初のコンパイルと同じコマンドに -MT フラグなどを追加して、オブジェクトのディレクトリと名前を正しく取得する方がはるかに簡単です。

この質問への回答に沿って、さらに何かを行います。

-MM を使用した make include ディレクティブと依存関係の生成

良いことは、すべての依存関係の生成がコンパイル ステップで行われるため、gcc を追加で呼び出す必要がないことです。すべての依存関係を 1 つのファイルにまとめることは、小さなファイルの場合はおそらく問題ありませんが、makefile をスケーリングする場合は、上記のようなことを行うのがおそらく最善です。

于 2013-03-10T17:34:38.330 に答える
1

ファイルを生成するには、パターン ルールを使用する必要があり.oます。

$(OBJECTS_DIR)/%.o : %.c 
        $(CC) $(CFLAGS) -c -o $@ $^ 

OBJECTS_DIR をターゲット パスに追加するには、依存関係ファイルを処理する必要があります。 sedこれを簡単にします。.hおそらく、ファイルに依存することも必要です。

$(DEPS): $(SOURCES) $(shell find . -name '*.h')
        $(CC) -MM  $(SOURCES) | sed 's#^\(.*:\)#$(OBJECTS_DIR)\1#' > $(DEPS)
于 2013-03-10T21:31:25.520 に答える