Генерация зависимостей Makefile без проверки заголовков - PullRequest
1 голос
/ 16 июля 2010

Я использую make-файл, предназначенный для автоматического создания зависимостей.Но с моим файлом я обнаружил, что, хотя изменения в заголовочных файлах приводят к перекомпиляции кода, они не вызывают пересоздание зависимостей, как мне кажется, они должны.Кто-нибудь может увидеть, что я пропустил?

.SUFFIXES : .hpp .cpp .d .o
SOURCES=main.cpp sub1.cpp sub2.cpp
OBJECTS=${SOURCES:.cpp=.o}
DEPENDENCIES=${SOURCES:.cpp=.d}

.cpp.d:
    g++ -MM $< > $@
.cpp.o:
    g++ $< -c `pkg-config gtkmm-2.4 --cflags --libs` -g

calculator: ${OBJECTS} ${DEPENDENCIES}
    g++ ${OBJECTS} -o calculator `pkg-config gtkmm-2.4 --cflags --libs` -g

include ${DEPENDENCIES}

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Хотя я согласен с решением Dummy00001, это может помочь добавить флаг -MP к команде g ++ для генерации файлов зависимостей. Он добавляет цели PHONY с именами всех заголовочных файлов в списке зависимостей.

т.е. если g++ -MM $< генерирует

test.o: test.cpp test.h dummy.h etc_bkp.h

затем g++ -MM -MP $< генерирует

test.o: test.cpp test.h dummy.h etc_bkp.h
test.h:
dummy.h:
etc_bkp.h:

это поможет make не сломаться, даже если переименование выполнено или файл был удален

1 голос
/ 16 июля 2010

Нашел решение сам.Трюк также появляется в официальной документации GNU make .

Строка для генерации зависимостей должна выглядеть следующим образом:

.cpp.d:
        g++ -MM $< | sed 's!^$(<:.cpp=.o):!$(<:.cpp=.o) $(<:.cpp=.d):!' > $@

sed переводит строку зависимости из"main.o: main.cpp include / hello.hpp" в "main.o main.d: main.cpp include / hello.hpp" (пример из моего свернутого теста), поэтому .d зависит от тех же файлов, что иСам файл .o.

Хотя я лично рекомендую использовать, например, SCons , который способен автоматически отслеживать зависимости, поскольку (по моему опыту) решение GNU часто ломается, когда новый заголовочный файлили некоторые файлы были переименованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...