0

私は見て、この質問に関連しているように見えるいくつかの回答を見つけましたが、どれも役に立たないようです.

これはよくある話です。.o ファイルにコンパイルしたい .hpp および .cpp ファイルのフォルダーがあり、依存するファイルが変更されたときにのみファイルを再コンパイルします。

私の現在のメイクファイルは次のとおりです。

SRCS = $(shell find ../Includes/ -name "*.cpp")
DEPS = $(SRCS:.cpp=.d)
OBJS = $(SRCS:.cpp=.o)

all: $(DEPS) $(OBJS)

# Create the dependency files
%.d : %.cpp
    clang++ -MM $< -o $@ -c -std=c++11

# Include the dependency files
include $(DEPS)

# Compile the source files
%.o : %.cpp
    clang++ -c -Wall -std=c++11 $< -o $@

これを数回実行しました (そのため、make を実行する前に依存関係ファイルが存在し、それらを含めると必ず存在するはずです)。また、%.o の依存関係に %.d を追加しようとしました。

基本的に、現時点で起こっていることは、.cpp を「タッチ」すると .o および .d ファイルが再生成され、.hpp ファイル (他のファイルの .d ファイルにリストされている) をタッチしても何も起こらないということだけです。

依存関係ファイルの例:

SomeFile.o : ../Includes/SomeFile.cpp \
    ../Includes/SomeFile.hpp ../Includes/SomeOtherFile.hpp
4

2 に答える 2

1

パスの問題は別として、途中で依存関係を作成する方が自然だと思います。つまり、-MDまたは-MMDフラグを使用します。そうすれば、依存関係ファイルを更新するためのルールは必要ありません。

CPPFLAGS += -MMD

TARGET := hello

.DEFAULT: all
all: $(TARGET)

SRCS := $(shell find . -type f -name "*.cpp")
OBJS := $(SRCS:.cpp=.o)
DEPS := $(SRCS:.cpp=.d)

hello: $(OBJS)
        $(LINK.cc) -o $@ $^

-include $(DEPS)
于 2013-03-08T13:37:39.907 に答える
0

以下のルールを作成していたことがわかりました。

SomeFile.o : ...

次のルールが必要でした。

../Includes/SomeFile.o : ...

私を正しい道に導いてくれた NovaDenizen に感謝します。

于 2013-03-08T13:21:12.367 に答える