4

Conway のライフ ゲームの小さな実装を C で書いています。ソース コードは 3 つのファイルに分割されています:main.cfunctions.c/functions.hで、関数の定義と宣言を記述します。

ここで、セルのグリッドを作成するために、次のタイプのマトリックスがあります。

Cell grid[GRID_HEIGHT][GRID_WIDTH];

ここでGRID_HEIGHT、 とGRID_WIDTHは で定義されている定数ですfunctions.h

#define GRID_HEIGHT 10
#define GRID_WIDTH 10

プログラムは正常に実行され、make と Makefile でコンパイルされます。しかし、問題は:GRID_HEIGHTまたはを変更しようとするGRID_WIDTHと、もう一度 Makefile を実行すると、すべてのファイルが最新であると表示されます! 古き良き方法を使用してコンパイルしようとしましたが、正常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 $< 
4

3 に答える 3

7

再コンパイルが に依存することを伝えていないためですfunctions.h

これを Makefile に追加してみてください:

%.o : functions.h

または、既存のルールを次のように変更します。

%.o : %.c functions.h
    $(CC) -c $< -o $@
于 2011-12-24T19:39:46.320 に答える
3

.o ファイルは .h ファイルに依存しないことを make に伝えたので、ヘッダーが変更されても何も再コンパイルしません。

正しく動作させるのは難しい (各 .c ファイルの依存関係を生成する必要がある) が、簡単な方法は、すべてのヘッダー ファイルを含む HEADERS を定義し、各 .o ファイルをすべてのヘッダーに依存させることです。

于 2011-12-24T19:39:56.640 に答える
3

GCC を使用している場合 (そうです)、-MDオプションをコンパイラに渡すことで一般的に解決できます。GCC は、インクルードされたヘッダーに対する Make 依存関係を含むファイルを生成します。

CC = gcc
OBJECTS = main.o functions.o

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

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

この質問には、ヘッダー関連の情報も含まれています。

于 2011-12-24T20:01:29.023 に答える