2016-05-13 3 views
0

このメイクファイルに問題があります。それぞれの.cppファイルに依存関係を取得したい.hpp例:ファイルmain.cppに依存関係があるmain.hpp.hppファイルの変更時にこのメークファイルがビルドされない理由

メイクファイルは正常に動作しますが、main.hppを変更するとMakeは再構築されません。

誰かが私にヒントを与えることはできますか?ありがとう

objetivo=control 
objetos=$(shell ls *.cpp | sed 's/cpp/o/') 
optimizacion=-O2 -pipe 
enlaces=-lncurses -lmenu -lpq -lform -lcdkw 
CPP=g++ -std=c++11 -Wall 

.PHONY: all clean debug rebuild 

all: $(objetivo) 

.cpp.o: $*.hpp 
    $(CPP) $(optimizacion) -c $< 

debug: CPP += -g 
debug: optimizacion= 
debug: $(objetivo) 

rebuild: clean all 

$(objetivo): $(objetos) 
    $(CPP) -o [email protected] $(enlaces) $(objetos) 

clean: 
    -rm *.o $(objetivo) 
+0

'$(shell ls)'を使うことは非常に問題で、 'sed'スクリプトは不正確です。あなたは '$(patsubst%.cpp、%.o、$(ワイルドカード* .cpp))'を望む。 – tripleee

+0

ありがとう。私はシェル関数を変更します。 – olafito18

答えて

1

あなたの解決策は適切ではないにしてください

%.o: %.hpp %.cpp 
     $(CPP) $(optimizacion) -c $*.cpp 

。 ファイルが変更されるたびに.oが再構築されますが、.cppファイルが変更されても再構築されません。

あなたは二つの異なる前提条件を持っているしたい場合は、あなたがそれらの両方リストする必要があります。CPPは、C++コンパイラのための通常の変数ではないことを

%.o: %.cpp %.hpp 
     $(CPP) $(optimizacion) -c $< 

は注意を。標準変数はCXXです。

あなたの最初の試みがうまくいかなかったのは、古いスタイルのサフィックスルールでは前提条件が許されないからです。詳細は、マニュアルを参照してください。

+0

あなたは正しいです!私は次の日にその問題に気付いた。ありがとう – olafito18

0

解決策が見つかりました。

私はルール.ccp.oを置き換え:今、私は関連HPPを変更するたびにマッチした.cppを再構築

とにかく感謝

+0

並列ビルド( '-j')では' rebuild'が壊れています。オブジェクトファイルのリストを得るために 'shell'を呼び出す必要もありません。' $(patsubst%.cpp、%.o、$(wildcard * .cpp)) 'も同じことをします。 – user657267

+0

私は再構築の失敗を気付かなかった。あなたが正しいです。どうもありがとう。 – olafito18

関連する問題