В проекте у меня есть:Работа с Makefile, исходных генераторов и генерации зависимостей с НКУ
main.cpp
template.sth
- гораздо
Для каждого .cpp
файла Я генерирующего .o
файл. Благодаря тому, что я мог бы написать простое правило для всех .o
целей (упрощенной, немного версии немного pseudcode для большей ясности):
OBJS = #list of all .o files needed
%.o: %.cpp
g++ -MM -MF %.d -MP -MT %.o %.cpp
g++ -c -o %.o %.cpp
Тогда я включаю все существующие .d
файлов, так что после каждого поколения я освежающие зависимости ,
Это сработало, если бы у меня не было template.sth
. Этот файл содержит некоторый шаблон для генерации файлов h
и cpp
файлов.
Когда один файл, т.е. main.cpp
включает в себя файл, созданный из template.sth
(позволяет сказать gen.h
):
- Инструкция генерации
.d
файл не работает, потому чтоgen.h
отсутствует:fatal error: gen.h: No such file or directory
include "gen.h"
- Даже если эти инструкции будут работать, есть проблема с моим «рабочим процессом». До сих пор я мог создать файл
.d
для следующего make. Он работал, потому что для добавления новых зависимостей требуется изменить одну из текущих зависимостей. Поэтому после добавления одного.o
происходит перестройка и создается новое.d
. Теперь мне нужно обнаружить, что перед тем, как сделать.o
, мне нужно сгенерироватьgen.h
отtemplate.sth
.
Есть ли способ сделать это автоматически? Проблема 1. может быть решена, если есть способ сообщить g++
, что если отсутствует файл .h
, он может просто добавить его в зависимости. После решения проблемы 1. Выполнение make несколько раз (я думаю, что дважды это всегда достаточно) в конечном итоге со встроенным проектом (первый make
будет генерировать файлы зависимостей, затем второй make
видит, что main.cpp
зависит от gen.h
, gen.h
отсутствует и есть инструкция, как создайте gen.h
, чтобы он создал gen.h
перед зданием main.o
).
Если это невозможно сделать как-нибудь автоматически, как его можно решить? Могу ли я написать в Makefile
инструкциях, которые будут строить все сгенерированные файлы перед любыми другими или мне нужно вручную добавить этот сгенерированный файл в качестве зависимостей во всех инструкциях .o
?
UPDATE:
После нескольких изменений, с -MG
флагом g++
генерирует правильные файлы даже для gen.h
. Теперь я могу создать свой проект с двумя командами make
. Сначала создадим правильные файлы .d
и сломаем, потому что gen.h
отсутствует. У второго будет .d
файлов, готовых, поэтому он будет генерировать gen.h
перед зданием main.o
, поэтому здание main.o
будет успешным.
Есть ли способ сгенерировать файл .d
, а затем использовать его, прежде чем генерировать .o
?
У меня есть это. Проблема в том, что в Makefile нет зависимости от main.o и gen.h. – Ari
@Ari Правильно ли, что вы ищете автоматический способ добавления 'gen.h' в список зависимостей' main.o'? Обратите внимание, что объектные файлы зависят от всех заголовков, которые они включают, поэтому зависимости, такие как 'main.o → gen.h', должны быть в вашем файле Makefile.' Gen.h' был сгенерирован или нет. –
@ MichaelGrünewald Да, так же, как я добавляю негенерированные зависимости. – Ari