makeの問題をデバッグしようとして髪を引っ張っています。make は特定の前提条件を順序のみの前提条件としてランダムに扱っているようで、それらに依存する静的ライブラリ ターゲットから除外されています。ほとんどの場合、ビルドは機能しますが、.cpp ファイルがビルドされても .a ファイルに含まれないことがあります。--debug を指定して Make を実行すると、疑わしい前提条件に関する次の出力が表示されます。
Prerequisite `blah.o' is newer than target `/path/to/foo.a`
Prerequisite `blah1.o' is newer than target `/path/to/foo.a`
Prerequisite `blah2.o' is newer than target `/path/to/foo.a`
No need to remake target `/path/to/foo.a'
.a に含まれる前提条件のすべてについて、最後の行は、予想どおり、「ターゲット /path/to/foo.a をリメートする必要があります」です。
make は複数のサブディレクトリで呼び出されるため、ターゲット /path/to/foo.a が数回更新されます。make を並行して実行していないので、ファイルの更新が互いに踏みつけられているとは思いません。.o の方が新しいにもかかわらず、make は意図的に .a ファイルを更新していないようです。foo.a を作成するためのレシピは次のとおりです。
$(OBJLIB): $(OBJS)
$(AR) $(ARFLAGS) $(OBJLIB) $?
ARFLAGS=rv と OBJLIB は /path/to/foo.a になります。
.o ファイルが順序のみの依存関係として扱われていると考えるのは正しいですか? 私がここで見逃しているものは他にありますか?$(info) を使用して OBJLIB と OBJS の内容を出力していますが、順序のみの依存関係を引き起こす変数の内容に間違ったパイプ ('|') 文字が入り込むことはありません。