私はmakefileをセットアップする方法を学んでおり、問題が発生しました。これを実証するために、ソースファイルmain.m
とtest.m
からなる単純な "プロジェクト"を作成しました。Makefileは常にファイルを再コンパイルする
私はこれらのファイルを(代が変わっている場合のみ)、コンパイル、および(ここではbuild/
)をどこか別の場所にオブジェクトファイルを保存するために作るのセットアップしようとしています
私のMakefile:
OBJ = ./build
SOURCES=main.m test.m
OBJECTS=$(addprefix $(OBJ)/,$(SOURCES:.m=.o))
EXECUTABLE=test
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
gcc $(OBJECTS) -o $(EXECUTABLE)
$(OBJECTS): $(OBJ)/%.o: %.m build/
gcc -c $< -o [email protected]
build/:
mkdir build
私は実行それ(だけMakefileと、カレントディレクトリにあるソースとの)最初の時間のためにそれは私がそれを行うことを期待します:
しかしgcc -c main.m -o build/main.o
gcc -c test.m -o build/test.o
gcc ./build/main.o ./build/test.o -o test
私はを実行した場合もう一度:
gcc -c main.m -o build/main.o
gcc ./build/main.o ./build/test.o -o test
どうしたのですか?私は "良い" Makefileを作成することを学んでいるので、Makefileに他のエラーがあることにも気づくでしょう。
編集:私はmake -d
から発見何
:
Finished prerequisites of target file `build/main.o'.
Prerequisite `main.m' is older than target `build/main.o'.
Prerequisite `build/' is older than target `build/main.o'.
No need to remake target `build/main.o'.
と
Finished prerequisites of target file `build/test.o'.
Prerequisite `test.m' is older than target `build/test.o'.
Prerequisite `build/' is newer than target `build/test.o'.
Must remake target `build/test.o'.
私はあなただけで、 '/'にbuild' 'に接続したくないと思いますいくつかの場所。ここでそれを試してみましょう。 'make -d'を使って' make 'が何を構築するかを決定する方法を知ることができます。 –
ありがとうございます。しかし、 'make -d'ルートは、927行の情報を出力するので、しばらく時間がかかるでしょう:) – varesa
posisbleと同じくらい多くの暗黙のルールを取り除くことで、それを静めることができます。私は単純なテストプロジェクトでメイクファイルを試しましたが、期待どおりに動作するように見えました。つまり、2回目の試合では、私はちょうど 'make: 'all'のために何もするつもりはない。 –