1

ここで何が間違っているのかわかりません。ソースファイルだけでなく、システムに含まれていないヘッダーファイルに対して、プロジェクトの依存関係を把握するために make を取得しようとしています。このテーマに関連するこのサイトから多くのリソースがあります。

例: Makefile ヘッダーの依存関係Makefile、ヘッダーの依存関係

しかし、私がするとき

touch MyHeader.h

これが機能するかどうかを確認するためのテストとして、私の make プロセスは、このヘッダーを含むソース ファイルの再構築に失敗しました。だから、これが私のmakefileにあるものです(関連性があります)

CPP=g++
CPPFLAGS=-Iadditional/includes -MMD
CXXFLAGS=-std=c++0x -c 
# not every source file in this directory needs to be included in this build
# this is because of shared code with Windows
SOURCESFILTER = File1.cpp File2.cpp

OBJ_DIR=obj
SOURCES = $(filter-out $(SOURCEFILTER),$(wildcard *.cpp))
OBJECTS = $(addprefix $(OBJ_DIR)/,$(SOURCES:.cpp=.o))

DEPENDENCIES = $(OBJECTS:.o=.d)

.PHONY: archive

archive : $(OBJECTS)
    ar mylib.a obj/*.o

-include $(DEPENDENCIES)

$(OBJ_DIR)/%.o: $(SOURCES) $(DEPENDENCIES)
    $(CPP) $(CPPFLAGS) $(CXXFLAGS) $< -o $@

上記のプロセスが実際に期待される *.d ファイルを生成することを確認しました。それらを正しく含めていると思います。ただし、前述のように、私が行うテストとして: touch MyHeader.h

これはソースと同じディレクトリにあり、make を再実行します。このヘッダーを含むソース ファイルはどれも再作成されません。私は何が欠けていますか?

アンディ

4

1 に答える 1

4

まず、接尾辞規則に前提条件を含めることはできません。できたとしても、 orを含めたくないのは確かです。なぜなら、ソースまたは依存ファイルが変更されるたびにすべてのオブジェクトが再構築されるからです。$(SOURCES)$(DEPENDENCIES)

第 2 に、make が期待する場所とは異なるディレクトリにターゲット ファイルを作成することはできません。Make は、ターゲットを見つけたい場所を変数$@に配置します。出力をその場所に正確に書き込む必要があります。を使用する上記のように、ターゲットを変更するルールが表示された場合obj/$@、それは機能しません。

ほとんどの場合、GCCはファイルを として書き込んobj/foo.dでいますincludeが、含めようとしていますfoo.dが、それは存在しません...しかし、-includemakeを使用したため、文句はありません。

最初にオブジェクト ファイルをローカル ディレクトリに書き込み、それを依存関係で動作させることをお勧めします。それが機能したら、ターゲットを別のディレクトリに書き込む方法を読んだり、もう一度質問したりしてください。

到着予定時刻:

次のようなことを試してください:

CXX := g++
CPPFLAGS := -Iadditional/includes -MMD
CXXFLAGS := -std=c++0x
# not every source file in this directory needs to be included in this build
# this is because of shared code with Windows
SOURCESFILTER := File1.cpp File2.cpp

OBJ_DIR := obj
SOURCES := $(filter-out $(SOURCEFILTER),$(wildcard *.cpp))
OBJECTS := $(addprefix $(OBJ_DIR)/,$(SOURCES:.cpp=.o))

DEPENDENCIES := $(OBJECTS:.o=.d)

.PHONY: archive

archive: mylib.a

mylib.a: $(OBJECTS)
        $(AR) $@ $^

-include $(DEPENDENCIES)

$(OBJ_DIR)/%.o: %.cpp
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
于 2013-04-25T18:23:44.187 に答える