私はそれは少し下のメイクファイルのように見える、いくつかのCソースファイルをコンパイルするためのMakefileを持っており、異なるビルドディレクトリに出力を置く:暗黙のルールがmakefileによってスキップされましたか?
OBJDIR=/home/test/alpha
SRCDIR=/home/test/beta
# make variable will be exanded when used (and not at declaration)
OBJECTS:= $(addprefix $(OBJDIR), $(notdir $(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c))))
SOURCES:=$(wildcard $(SRCDIR)/*.c))
.PHONY: copySourcesOver linkSources sharedLibrary
copySourcesOver: $(SOURCES)
cp $(SOURCES) $(OBJDIR)/
# pattern
$(OBJECTS)/%.o : $(OBJECTS)/%.c
gcc -fPIC $< -o [email protected]
linkSources: $(OBJECTS)
gcc -shared -o libshared.so [email protected]
sharedLibrary: copySourcesOver \
linkSources \
だから何が起こっているが、私は、ターゲットを実行するとことです。
make sharedLibrary
$(OBJECTS)
のルールはありません。面白いのは、このターゲットをもう一度makefileエラーが出ないようにするときです。共有ライブラリを取得します。
私は少しの研究を行いましたが、MakefileがPHONYターゲットの暗黙のルールを拡張しないことを知りました。そのため、をPHONYターゲットから通常のファイルに変更しました。しかし残念ながら、それは問題を解決しません。
パターンは、私がmake sharedLibrary
以下の答えが何を指摘しているかとは別に、複数のジョブ( '-j')を使用するとmakefileも壊れます。前提条件が順番に実行されるという保証はありません。一方の前提条件が他の条件に依存する場合は* makefile *でこれを表現してください。 – user657267
良い点。すべての依存関係を追加します – Bionix1441
あなたのルールの中には、ターゲットを依存関係としてターゲットや依存関係として記述していないものがあるため、ルールを実行する必要があるかどうかを 'make'がチェックして正しく動作することは期待できません。 – reinierpost