1

すべてのソース ファイルが ./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、または依存関係などでの使用は許可されていません$@か?

4

1 に答える 1

7

前提条件では使用できず$@、コマンドでのみ使用できます。

しかし、これを行うことができます:

$(OBJECTS): obj/%.o : src/%.cpp
    @echo Building $@ from $<...
    $(CXX) $(CPPFLAGS) -c $< -o $@
于 2012-12-07T03:30:33.673 に答える