2011-12-24 1 views
3

Я пишу небольшую реализацию игры жизни Конвея в C. Исходный код разбит на три файла: main.c и functions.c/functions.h, где я поставил свои функции определения и декларации.«make» не перекомпилируется, когда исходный файл был отредактирован.

Теперь, чтобы создать сетку клетки, у меня есть матрица этого типа:

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, он говорит, что все файлы обновлены! Я пытался скомпилировать, используя хороший 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', но вы не указали, что зависимость в make-файле – pmg

+0

Если все это кажется слишком сложным, я бы рекомендовал [SCons] (http://scons.org) - ваш полный файл сборки будет одной строкой «Программа (« Игра жизни », [« main.c »,« functions.c »], LIBS = [« ncurses »]). SCons автоматически определяет зависимости файла заголовка в зависимости от сами источники, поэтому вам не нужно об этом думать. –

ответ

5

Потому что вы не сказали, что это перекомпиляция зависит от functions.h.

Попробуйте добавить это к вашему Makefile:

%.o : functions.h 

В качестве альтернативы, измените существующее правило, чтобы быть:

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

Спасибо. Я на своих первых шагах с маркой. – Lubulos

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' –

+0

Да, я согласен. Также некоторые реализации (включая GNU Make) распознают 'sinclude'. –

Смежные вопросы