C++ソースをコンパイルするための基本的な最小限のmakefileがあります。削ぎ落としたバージョンは、次のようになります。ゼロから構築する場合、すべてが期待どおりに動作GNU Makeは前提条件をスキップしているようです。
TARGET = main
OBJ = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
CPPFLAGS = -std=c++11 -Wall
build: $(TARGET)
$(TARGET): $(OBJ)
@echo "$? --> [email protected]"
g++ $(CPPFLAGS) -o [email protected] $?
@echo
%.o: %.cpp
@echo "$< --> [email protected]"
g++ $(CPPFLAGS) -c $<
@echo
:
clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp
main.cpp --> main.o
g++ -std=c++11 -Wall -c main.cpp
clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o
ソースファイルのいずれかに変更後、make
は、対応するオブジェクトファイルを再構築しますリンク(clock.o --> main
代わりのclock.o main.o --> main
)にしようとしたときが、何らかの理由で、既存の(変わらず)オブジェクトファイルをスキップします:
clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp
clock.o --> main
g++ -std=c++11 -Wall -o main clock.o
予想通り、任意のファイルを変更せずに、再びリンクする作品ををmake
を実行している場合:
clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o
は何この挙動の理由だし、どのようにそれを防ぐことができましたか?
私はあなたがg++ $(CPPFLAGS) -o [email protected] $?
レシピに間違った自動変数を使用GNUはi686のLinuxの4.4