'make' не перекомпилируется, когда исходный файл был отредактирован - PullRequest
3 голосов
/ 24 декабря 2011

Я пишу небольшую реализацию игры жизни Конвея в C. Исходный код разделен на три файла: main.c и functions.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 $< 

Ответы [ 3 ]

5 голосов
/ 24 декабря 2011

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

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

%.o : functions.h

Или измените существующее правило:

%.o : %.c functions.h
    $(CC) -c $< -o $@
3 голосов
/ 25 декабря 2011

Если вы используете GCC (ну, конечно), то это можно решить в общем случае, передав -MD параметр компилятору, GCC сгенерирует файл, содержащий зависимости Make от включенных заголовков:

CC = gcc
OBJECTS = main.o functions.o

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

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

Некоторую информацию, связанную с заголовками, также можно найти в этом вопросе.

3 голосов
/ 24 декабря 2011

Вы сказали, что файлы .o не зависят от файлов .h, поэтому он ничего не перекомпилирует при изменении заголовка.

Трудно заставить его работать правильно (вам нужно создать зависимости для каждого файла .c), но простой способ - просто определить заголовки, которые содержат все ваши файлы заголовков, и сделать каждый файл .o зависимым от всех ваших заголовков.

...