среда, 27 апреля 2011 г.

GNU Make и автоматическая генерация зависимостей для файлов исходного кода C/C++

Для знающих проблема известная и давно решённая, но я с этим столкнулся только сегодня.

Итак, у нас имеется небольшой проект на C/C++, который собирается с помощью make. Пусть это будет программа под названием «program». В Makefile написано примерно следующее:
OUT = program

CXXFLAGS = -Wall -c -O2

SRC = $(wildcard *.cpp)
# Expand SRC wildcard and replace extension from .cpp to .o
OBJ = $(patsubst %.cpp, %.o, $(SRC))

$(OUT): $(OBJ)
    $(CXX) -o $(OUT) $(OBJ)
Когда мы изменяем какой-нибудь файл исходного кода foo.cpp и собираем проект, всё работает как часы: make замечает изменение foo.cpp, заново его (и только его) компилирует и запускает линковщик. Но make не замечает изменений в заголовочном файле foo.h, который подключается из foo.cpp.