2017-02-12 9 views
1

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

答えて

2

に4.1を作成し実行していますよ。 https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

$?

ターゲットより新しいすべての前提条件の名前は、それらの間にスペースを入れた です。

だから、あなたがしていることを正確に確認してください。すべての更新された前提条件からメインターゲットをリンクし、手つかずの前提条件をスキップしてください。

g++ $(CPPFLAGS) -o [email protected] $^レシピで問題を解決します。

関連する問題