Позволяет говорят, что у меня есть файлы:
Освобождает:
Программа:
Есть ли путь, для создания Make-файла, который скомпилирует только, что *.cpp, которые были изменены от последней компиляции?
В настоящее время у меня есть что-то как этот:
SRCS = one.cpp two.cpp three.cpp
OBJS = $(SRCS:.cpp=.o)
all: $(OBJS) program
.cpp.o:
g++ -Wall -c $<
program:
g++ -Wall $(OBJS) program.cpp -o program
clean:
rm -f $(OBJS) program
Я хорошо работаю, но когда я компилирую свою программу и затем изменяю two.cpp или two.h, я должен работать, "делают чистыми" первый, потому что, когда я, во-вторых, работаю, "делают", я добираюсь:
Nothing to be done for 'all'.
Я хотел бы изменить свой Make-файл таким образом, он распознает мои изменения и перекомпилирует тот файл и его зависимости (если one.cpp будет использовать код от two.cpp, который был изменен, оба файла должны быть перекомпилированы).
Таким образом, если я изменяю two.cpp, сделайте, должен сделать:
g++ -Wall -c two.cpp
g++ -Wall $(OBJS) program.cpp -o program
Но если one.cpp использует код от two.cpp, который был изменен, заставьте shold сделать:
g++ -Wall -c one.cpp
g++ -Wall -c two.cpp
g++ -Wall $(OBJS) program.cpp -o program
Сначала мы сделаем объектные файлы предпосылками исполняемого файла. После этого Make будет пересобирать program
при каждом изменении SRCS, поэтому нам не нужен OBJS
в качестве явной цели:
all: program
program: $(OBJS)
g++ -Wall $(OBJS) program.cpp -o program
Затем мы сделаем заголовочные файлы предпосылками объектов, так что если мы изменим three.h, Make пересоздаст three.o:
$(OBJS): %.o : %.h
И наконец, поскольку one.cpp использует код из two. cpp посредством two.h (я надеюсь), мы делаем two.h необходимым условием one.o:
one.o: two.h
И чтобы сделать вещи чище и проще в обслуживании, мы используем автоматические переменные:
program: $(OBJS)
g++ -Wall $^ program.cpp -o $@
Сложите все это вместе и мы получим:
SRCS = one.cpp two.cpp three.cpp
OBJS = $(SRCS:.cpp=.o)
all: program
$(OBJS): %.o : %.h
one.o: two.h
.cpp.o:
g++ -Wall -c $<
program: $(OBJS)
g++ -Wall $^ program.cpp -o $@
clean:
rm -f $(OBJS) program
Есть еще несколько вещей, которые мы могли бы сделать (например, добавить program.o в OBJS
), но этого достаточно на сегодня.
Добавьте файлы, от которых зависит выполнение команды, справа от имени цели.
Пример:
default: hello.c
gcc -o hello.bin hello.c
install: hello.bin
cp hello.bin ../
Все, что вам нужно сделать, это сообщить make
, что файл .o зависит от файла .cpp:
%.cpp.o: %.cpp
g++ -Wall -c -o $@ $<