2017-11-17 5 views
0

を更新している場合でも、ファイルを作成していない: -makeは依存関係が、これは私のメイクファイルである

VER = Debug 
CC = g++ 

OBJECTFIELS = main.o Time.o 

main: $(OBJECTFIELS) 
    $(CC) $(OBJECTFIELS) -o [email protected] 

$(OBJECTFILES): Time_.h 

clean: 
    rm $(OBJECTFIELS) main 

私はTime_.hファイルを変更するたびに、何も起こりません: - 他の

$ make 
make: 'main' is up to date. 
$ touch Time_.h 
$ make 
make: 'main' is up to date. 

をファイルを変更するとコンパイルされます: -

私は完全なnoobです。なぜこれが起こっているのか教えてください

+2

Typo:あなたの変数は 'OBJECTFIELS'と呼ばれますが、あなたは' OBJECTFILES'としてそれを使用しようとしています。 – melpomene

+0

@melpomeneありがとうございました!私はとても愚かで怒っている –

答えて

-3

Time_.hのルールで新しい.oファイルを生成する必要があります。

$(OBJECTFILES): Time_.h 

これは、Time_.hが更新されるたびにmakeがコマンドを実行し、コマンドがmain.oとTime.oの両方を生成することを示しています。しかし、コマンドは与えられていない!

Time.o: Time_.h 
     $(CC) Time_.cpp -o Time.o 

これは、ルールの種類です。 Time_.hが変更されるたびに$(CC)Time_.cpp -o Time.oが実行され、Time.oが生成されます。他のいくつかのルールがTime.oに依存する場合、makeはこのコマンドを使用してTime.oを作成できることを知っていますが、前回のmakeの実行以降にTime_.hが変更された場合にのみ実行する必要があります。

ソースファイル名が期待しているオブジェクトファイルと完全に一致していないように見えるので、「Time.o」を明示的に指定しています。 (Time.o vs Time_.o)

+0

ですが、このマニュアルではこのsysntaxを使うことができます: - https://www.gnu.org/software/make/manual/html_node/Combine-By-Prerequisite.html#Combine-By-Prerequisite –

+0

私は今、そのスタイルを避けるでしょう...標準的なmakefileフォーマットについてはこちらをご覧ください:https://www.gnu.org/software/make/manual/html_node/Rule-Example.html#Rule-Example – Ebonair

+1

これはありません必要です。 Makeは、ソースファイルからオブジェクトファイルを構築する方法を知っています。組み込みルールを使用するには、組み込みのルールを使用するのが理想的です。避けてはいけません。質問の元のメークファイルは完全に正しいので、上記のコメントに記載されている変数名のタイプミスを除き、変更は必要ありません。 – MadScientist

関連する問題