すべてのソース ファイルが ./src/ にあり、すべてのオブジェクト ファイルが ./obj/ にあるフォルダー構造があります (同じ内部ディレクトリ構造で、パス置換を使用してミラー化されます)。次のメイクファイルを作成しました。
$(EXECUTABLE): $(OBJECTS)
@echo Linking $(EXECUTABLE)...
$(CXX) $(LDLIBS) $(OBJECTS) -o $(EXECUTABLE)
%.o: $(subst o,cpp,$(subst obj/,src/,$@))
@echo Building $@...
$(CXX) $(CPPFLAGS) -c $(subst o,cpp,$(subst obj/,src/,$@)) -o $@
うまくいかない!ソース ファイルが実際にはオブジェクト ファイルよりも古い場合でも、Make はオブジェクト ファイルが最新であると主張し続けます。一方、私がこれを行うと:
obj/main.o: src/main.cpp
@echo Building $@...
$(CXX) $(CPPFLAGS) -c src/main.cpp -o $@
すべてのソース ファイルで、完全に機能します。私がチェックしたところ、2つsubst
は同じ結果になりました(obj/main.oは予想どおりsrc/main.cppになります)。しかし、Make は何らかの理由で依存関係を受け入れません。
これは私に多くの悲しみを与えています。誰かが私がどこで間違っているのか説明できますか? 何が起こっているのかわかりません。同じ出力が得られるため、置換は同じように機能すると思いました。subst
、または依存関係などでの使用は許可されていません$@
か?