Для большого проекта, который может извлечь выгоду из некоторого рефакторинга, одна из моих целей — уменьшить сцепление. Я смотрю на связывание здесь как на способность разбивать код на очень маленькие / логические блоки компиляции, так же, как объясняется связывание в Этот документ 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)*
На первый взгляд кажется, что ваша проблема в том, что ваши правила «% .o:%. Hpp» и «% o:%. Cpp» фактически не создают файл, указанный слева. Как правило, make определяет, что не нужно выполнять никаких действий, проверяя файл, указанный слева, и определяя, является ли он более новым, чем файлы, перечисленные в качестве его зависимостей, но поскольку файл слева никогда не появляется в результате Правило, правило всегда должно выполняться. Попробуйте указать «.object / foo.o» в левой части, а не перехватывать встроенное правило (я также настоятельно рекомендую не использовать такие команды, как «CC», которые должны быть предоставлены Make).