2016-03-25 8 views
1

私は今このMakefileを少なくとも3回は動作させようとしています。それぞれの反復で、以前のいくつかの問題を修正しながら、私の目標に近づきつつありますが、公式のGNUドキュメントを読み直しています。今私は理解していない場所が1つだけ残っています。ここでmakeはすべてのオブジェクトを再コンパイルしますか?

はMakefileのだ:

MAKEFLAGS=-j2 
CC=clang++ 
OPTIMALIZATION=-O2 
CFLAGS=-c -std=c++11 -gsplit-dwarf -I. -Iengine -Iengine/bootstrap 
LDFLAGS=-lglut -lGL -lGLU -lGLEW -lSOIL -lassimp 
SOURCES=$(wildcard *.cpp engine/*.cpp engine/lighting/*.cpp engine/bootstrap/*.cpp) 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=$(addprefix build/,$(shell basename ${PWD})) 

.PHONY: depend clean 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(addprefix build/,$(notdir $(OBJECTS))) -o [email protected] $(LDFLAGS) 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o build/$(notdir [email protected]) 

run: all 
    ./$(EXECUTABLE) 

clean: 
    rm -rf build/* 

depend: $(SOURCES) 
    makedepend $^ 

# DO NOT DELETE 

私の目標は、./buildディレクトリにすべてのファイルを構築することです。そして、私は最近、いくつかのファイル名関数を使ってこれを行うことができました。

しかし今はmakeまたはmake runを実行するたびに、プロジェクト全体が再コンパイルされます。

最近変更されたファイルに対してのみ動作するように修正するにはどうすればよいですか?

+0

私はメイクの専門家でありませんが、あなたの '.cpp.o'ルールは何の依存関係を示していますない私には思えます。 – Angew

答えて

2

は、私はあなたがオブジェクトが./buildディレクトリにあるMakefileを伝えるために

OBJECTS=$(SOURCES:.cpp=.o) 

の代わりにこの

OBJECTS=$(addprefix ./build/, $(SOURCES:.cpp=.o)) 

のようなオブジェクトを設定する必要があると思います。 現在$(CC)に出力を./build(-o build ...)で出力するように指示していますが、OBJECTSが最新のものかどうかをチェックする必要があるときは、現在のディレクトリコンパイルを再トリガします。

これが完了したら、リンカーコマンドからaddprefixを削除できます。

+0

あなたが提案したとおりに変更しましたが、今は 'ビルド/ assimptemplate'に必要な 'ターゲットを作るためのルールなし '/' MyApp.o 'という文句があります。 '' assimptemplate''は最終的な実行可能ファイルの名前です。この規則は、A意味$(OBJECTS)\ nは$(CC)$(OBJECTS)-o $ @ $(LDFLAGS) ' – poetryofruins

0

.cpp.o:はあなたのメイクファイルに奇妙に見えます。おそらく暗黙的なルールが実行されるでしょう(https://www.gnu.org/software/make/manual/html_node/Using-Implicit.html#Using-Implicit参照)。あなたのコンパイラコマンドが実行されるのを確実にするために、echoコマンドを追加するか、impliciteコマンドを追加することができます。

+0

:' $(実行):これは明らかに次のようになりますこれは、リンク段階によって生成されます'.cpp'ファイルを' .cpp'ファイルのすぐ隣にある '.o'ファイルに直接対応させます。 – user3159253

関連する問題