2011-12-24 8 views
3

私は、ConwayのGame of LifeをCで少し実装しています。ソースコードはmain.cfunctions.c/functions.hの3つのファイルに分割されています。定義と宣言。ソースファイルを編集したときに 'make'が再コンパイルされない

は今、セルのグリッドを作成するために、私はこのタイプのマトリックスを持っている:

GRID_HEIGHTGRID_WIDTHfunctions.hで定義されている定数です
Cell grid[GRID_HEIGHT][GRID_WIDTH]; 

#define GRID_HEIGHT 10 
#define GRID_WIDTH 10 

プログラムが正常に動作します、 makeとMakefileでコンパイルします。しかし、問題は:GRID_HEIGHTまたはを変更しようとすると、私はMakefileを再度実行すると、すべてのファイルが最新であると言います! 私は良いol 'の方法でコンパイルしようとしましたgcc main.c etc.とそれは必要なように実行されます。なぜ、makeはソースを再コンパイルしないのですか?

これは私のMakefileです:

CC = gcc 
OBJECTS = main.o functions.o 

Game\ of\ Life : $(OBJECTS) 
    $(CC) $(OBJECTS) -o Game\ of\ Life -lncurses 

%.o : %.c 
    $(CC) -c $< 
+0

'main.o'は' functions.h'に依存しているので、makefileにその依存関係を指定していないので – pmg

+0

これはすべて複雑すぎると思われる場合は[SCons](http://scons.org)あなたの完成したビルドファイルは 'Program(" Game of Life "、" main.c "、" functions.c ")、LIBS = [" ncurses "]という単一行になります。ソースそのものなので、それについて考える必要はありません。おかげさまで –

答えて

5

あなたは再コンパイルがfunctions.hに依存していることを告げていないので。

あなたのMakefileにこれを追加してみてください。また

%.o : functions.h 

、であるためにあなたの既存のルールを変更します。

%.o : %.c functions.h 
    $(CC) -c $< -o [email protected] 
+0

私はmakeとの最初のステップにいます。 – Lubulos

3

あなたは.oファイルが.hのに依存しないことを確認指示しましたしたがって、ヘッダーが変更されたときには何も再コンパイルしません。

それぞれの.cファイルの依存関係を生成する必要がありますが、すべてのヘッダーファイルを含むHEADERSを定義し、すべてのヘッダーに依存するようにするのは簡単です。

3

あなたはGCC(まあ、あなたがしている)、それはコンパイラに-MD optionを渡すことで、包括的に解決することができますを使用している場合は、GCCが含まヘッダーに依存関係を作る含むファイルを生成します。

CC = gcc 
OBJECTS = main.o functions.o 

%.o : %.c 
    $(CC) -MD -c $< 

-include $(OBJECTS:.o=.d) 

一部ヘッダー関連の情報はthisの質問にも記載されています。

+0

これはGNU makeの使用にも依存することに注意してください - makeのいくつかのバージョンは 'include'を理解していません –

+0

はい、私は同意します。また、いくつかの実装(GNU Makeを含む)は 'sinclude'を認識します。 –

関連する問題