Использование make-файлов для определения и уменьшения связи

Для большого проекта, который может извлечь выгоду из некоторого рефакторинга, одна из моих целей — уменьшить сцепление. Я смотрю на связывание здесь как на способность разбивать код на очень маленькие / логические блоки компиляции, так же, как объясняется связывание в Этот документ 3.1.

Итак, я пишу Makefile чтобы проверить исходные файлы, как я иду один.
Цель состоит в том, чтобы все объектные файлы компилировались в .object/ каталог. Идея состоит в том, что, когда эти большие исходные файлы не могут быть собраны, я нашел место, которое требует внимания.

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

При использовании подобного make-файла я ошибаюсь в своем подходе? Есть ли лучший способ для такого рефакторинга — если не использовать IDE со встроенными инструментами?

CC       = g++
CC_FLAGS = -std=c++0x -pthread
LI_FLAGS =
EXEC     = UAVapp.o
OUT      = .object/

#Types/
T = Arming.hpp JCommand.hpp
TYPES  = $(T:%=Types/%)

#Extensions
HPP     = Defines.hpp $(TYPES)
CPP     =

#Groups
COBJ    = $(CPP:.cpp=.o)
HOBJ    = $(HPP:.hpp=.o)

all: PRE $(EXEC)

# Main target
$(EXEC): $(HOBJ)
touch $(EXEC)
#$(CC) $(LI_FLAGS) $(CC_FLAGS) $(OUT)$(COBJ) -o $(EXEC)%.o:%.hpp
$(CC) -c $< $(CC_FLAGS) -o $(OUT)$(notdir $@)
%.o:%.cpp
$(CC) -c $< $(CC_FLAGS) -o $(OUT)$(notdir $@)

# Do work before compilation
PRE:
@mkdir -p $(OUT)
clean:
rm -rf ./*.o $(EXEC) ./$(OUT)*

0

Решение

На первый взгляд кажется, что ваша проблема в том, что ваши правила «% .o:%. Hpp» и «% o:%. Cpp» фактически не создают файл, указанный слева. Как правило, make определяет, что не нужно выполнять никаких действий, проверяя файл, указанный слева, и определяя, является ли он более новым, чем файлы, перечисленные в качестве его зависимостей, но поскольку файл слева никогда не появляется в результате Правило, правило всегда должно выполняться. Попробуйте указать «.object / foo.o» в левой части, а не перехватывать встроенное правило (я также настоятельно рекомендую не использовать такие команды, как «CC», которые должны быть предоставлены Make).

1

Другие решения


По вопросам рекламы [email protected]