Как у меня может быть Make-файл, автоматически восстанавливают исходные файлы, которые включают измененный заголовочный файл? (В C/C++)

Вы можете найти нужный объект и обновить свойство, если оно найдено.

let object = { ab: [{ cd: "ee", col_val: {} }, { ef: "uu", col_val: { gg: "hh" } }] },
    target = (object["ab"] || []).find(o => 'cd' in o);

if (target) {
    target.col_val = { rr: "ff" };
}

console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

86
задан Nicholas Flynt 18 November 2008 в 01:03
поделиться

5 ответов

В основном необходимо динамично создать правила make-файла восстановить объектные файлы, когда заголовочные файлы изменяются. При использовании gcc и gnumake это довольно легко; просто поместите что-то как:

$(OBJDIR)/%.d: %.c
        $(CC) -MM -MG $(CPPFLAGS) $< | sed -e 's,^\([^:]*\)\.o[ ]*:,$(@D)/\1.o $(@D)/\1.d:,' >$@

ifneq ($(MAKECMDGOALS),clean)
include $(SRCS:%.c=$(OBJDIR)/%.d)
endif

в Вашем make-файле.

4
ответ дан 24 November 2019 в 08:07
поделиться

Необходимо будет сделать отдельные цели для каждого файла C и затем перечислить заголовочный файл как зависимость. Можно все еще использовать универсальные цели и просто поместить .h зависимости впоследствии, как так:

%.o: %.c
        @echo Compiling $<...
        $(CC) $(CFLAGS) -c -o $@ $<

foo.c: bar.h
# And so on...
7
ответ дан 24 November 2019 в 08:07
поделиться

Это эквивалентно ответу Криса Додда, но использует другое соглашение об именовании (и, по совпадению, не требует sed магии. Скопировано из более позднего дубликата.


Если вы используете компилятор GNU, компилятор может собрать список зависимостей для вас. Фрагмент Makefile:

depend: .depend

.depend: $(SOURCES)
        rm -f ./.depend
        $(CC) $(CFLAGS) -MM $^>>./.depend;

include .depend

Существует также инструмент makedepend, но он мне никогда не нравился так же, как gcc -MM

17
ответ дан 24 November 2019 в 08:07
поделиться

Я думаю, что команда mkdep - это то, что вам нужно. Она фактически сканирует .c файлы на наличие строк #include и создает дерево зависимостей для них. Я полагаю, что проекты Automake/Autoconf используют ее по умолчанию.

-1
ответ дан 24 November 2019 в 08:07
поделиться

Вы могли бы добавить команду «сделать зависимость», как заявляли другие, но почему бы не заставить gcc создавать зависимости и компилировать одновременно:

DEPS := $(COBJS:.o=.d)

-include $(DEPS)

%.o: %.c
    $(CC) -c $(CFLAGS) -MM -MF $(patsubst %.o,%.d,$@) -o $@ $<

Параметр «-MF» указывает файл, в котором будут храниться зависимости.

Тире в начале '-include' указывает Make продолжить, когда файл .d не существует (например, при первой компиляции).

Обратите внимание, что в gcc есть ошибка, связанная с параметром -o. Если в качестве имени файла объекта указать obj / _file__c.o , то сгенерированный _file_.d по-прежнему будет содержать _file_.o , а не obj / _file_c.o .

20
ответ дан 24 November 2019 в 08:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: