2011-12-24 97 views
3

我正在編寫一個C語言版本的Conway生命遊戲的小實現。源碼分爲三個文件:main.cfunctions.c/functions.h,我把函數定義和聲明。編譯源文件時'make'不重編譯

現在,爲了創建單元的網格,我有這種類型的矩陣:

Cell grid[GRID_HEIGHT][GRID_WIDTH]; 

其中GRID_HEIGHTGRID_WIDTH爲常數在functions.h定義:

#define GRID_HEIGHT 10 
#define GRID_WIDTH 10 

該程序運行正常,用make和Makefile編譯。但問題是:如果我嘗試更改GRID_HEIGHTGRID_WIDTH,當我再次運行我的Makefile時,它說所有文件都是最新的! 我試圖用良好的方式編譯gcc main.c etc.,並且它運行正常。那麼,爲什麼不重新編譯源代碼?

這是我的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 2011-12-24 19:39:26

+0

這種依賴性如果這一切似乎太複雜了,我可能會建議[SCons的(http://scons.org) - 你的完整構建文件將是單一行'Program(「Game of Life」,[「main.c」,「functions.c」],LIBS = [「ncurses」])SCons自動確定頭文件依賴性來源本身,所以你不必考慮它。 – 2011-12-24 20:02:33

回答

5

因爲你還沒有告訴它重新編譯依賴於functions.h

嘗試增加這你的Makefile:

%.o : functions.h 

另外,修改現有的規則是:

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

謝謝。我正在做第一步。 – Lubulos 2011-12-24 19:52:44

3

你告訴做出.o文件不依賴於.H文件,所以當標題改變時它不會重新編譯任何東西。

讓它正常工作很困難(您需要爲每個.c文件生成依賴關係),但一個簡單的方法就是定義包含所有頭文件的HEADERS,並使每個.o文件依賴於所有頭文件。

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' – 2011-12-24 20:07:36

+0

是的,我同意。還有一些實現(包括GNU Make)可以識別'sinclude'。 – 2011-12-24 20:10:34