.cpp ファイルを .o ファイル経由で実行可能ファイルに自動的にコンパイルおよびリンクするメイクファイルを作成しようとしています。私がうまくいかないのは、自動化された(または手動でさえも)依存関係の生成です。以下のコメント付きコードのコメントを外すと、実行時に何も再コンパイルされませんmake build
。make: Nothing to be done for 'build'.
xh(または.hファイル)が変更されたとしても、私が得るのは. 私はこの質問から学ぼうとしています: Makefile、ヘッダーの依存関係、特に dmckee の答え。このメイクファイルが機能しないのはなぜですか?
明確化: すべてをコンパイルできますが、ヘッダー ファイルを変更しても、それに依存する .cpp ファイルは更新されません。したがって、たとえば、ソース全体をコンパイルする#define
と、ヘッダー ファイルで a を変更してから を実行すると、次のようmake build
になりますNothing to be done for 'build'.
(以下のコードのコメント チャンクのコメントを解除した場合)。
CC=gcc
CFLAGS=-O2 -Wall
LDFLAGS=-lSDL -lstdc++
SOURCES=$(wildcard *.cpp)
OBJECTS=$(patsubst %.cpp, obj/%.o,$(SOURCES))
TARGET=bin/test.bin
# Nothing happens when i uncomment the following. (automated attempt)
#depend: .depend
#
#.depend: $(SOURCES)
# rm -f ./.depend
# $(CC) $(CFLAGS) -MM $^ >> ./.depend;
#
#include .depend
# And nothing happens when i uncomment the following. x.cpp and x.h are files in my project. (manual attempt)
#x.o: x.cpp x.h
clean:
rm -f $(TARGET)
rm -f $(OBJECTS)
run: build
./$(TARGET)
build: $(TARGET)
$(TARGET): $(OBJECTS)
@mkdir -p $(@D)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
obj/%.o: %.cpp
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) $< -o $@