Nano Hash - криптовалюты, майнинг, программирование

Развязанные зависимости Makefile

Со следующим фрагментом make-файла:

main: main.o f1.o f2.o
    $(CC) $(CFLAGS) -o program main.o f1.o f2.o

main.o: main.cc
    $(CC) $(CFLAGS) -c main.cc

f1.o: f1.cc
    $(CC) $(CFLAGS) -c f1.cc

f2.o: f2.cc
    $(CC) $(CFLAGS) -c f2.cc

Если я просто изменю один файл, только этот файл будет перекомпилирован, когда я перезапущу make по желанию. Однако мне трудно обобщить это, не перечисляя каждый файл по отдельности. Когда я пытаюсь что-то вроде:

$(OBJECTS): $(SOURCES)
    $(CC) $(CFLAGS) -o $@ -c $(patsubst %.o,%.cc,$@)

Он строит каждый объектный файл отдельно, но каждый объектный файл зависит от ВСЕХ моих исходников, поэтому изменение любого файла вызывает полную перекомпиляцию. Как это сделать?

17.02.2016


Ответы:


1

По сути, вам нужно перечислить зависимости каждого .o файла по отдельности. Например, каждый .o, скорее всего, будет зависеть от другого набора заголовков. Взяв f1.o, вам нужно что-то вроде:

f1.o: include/i.h
f1.o: another.h dir/and-another.h
f1.o: f1.cc
    $(CC) $(CFLAGS) -c f1.cc

(вы можете иметь столько строк зависимости для цели, сколько хотите).

Ведение этого списка — кошмар. Неработающие списки зависимостей делают ваш Makefile хуже, чем бесполезным — с таким же успехом можно использовать пакетный файл.

Не все потеряно! Если вы аккуратны, вы можете заставить компилятор делать это автоматически, и почти бесплатно. Делает ваш Makefile более аккуратным при загрузке. Выиграй, выиграй.

22.02.2016

2

Как прокомментировал Исмаил Бадави, шаблонные правила обеспечивают хорошее решение. . Это разновидность неявного правила. для сделать. По сути, неявные правила — это автоматические рецепты, основанные на расширении файла. Например, make умеет неявно преобразовывать файлы .c в файлы .o. По умолчанию make запускает следующий рецепт для файлов .c (см. каталог правил):

$(CC) $(CPPFLAGS) $(CFLAGS) -c

Вы можете изменить процесс, либо установив переменные CC, CPPFLAGS и CFLAGS, либо определив шаблонное правило:

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

«$‹» выше соответствует имени первого пререквизита, которым в этом примере будет файл .c. См. комментарий Беты и автоматические переменные.

18.02.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..