Как определить правила в Make-файле для компиляции только, что *.cpp файлы, который был изменен (и их зависимости), не все *.cpp файлы

Позволяет говорят, что у меня есть файлы:

Освобождает:

  • one.cpp, one.h
  • two.cpp, two.h
  • three.cpp, three.h

Программа:

  • program.cpp

Есть ли путь, для создания 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
9
задан user360872 21 June 2010 в 19:26
поделиться

3 ответа

Сначала мы сделаем объектные файлы предпосылками исполняемого файла. После этого 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), но этого достаточно на сегодня.

12
ответ дан 4 December 2019 в 15:11
поделиться

Добавьте файлы, от которых зависит выполнение команды, справа от имени цели.

Пример:

default: hello.c
   gcc -o hello.bin hello.c

install: hello.bin
   cp hello.bin ../
1
ответ дан 4 December 2019 в 15:11
поделиться

Все, что вам нужно сделать, это сообщить make , что файл .o зависит от файла .cpp:

%.cpp.o: %.cpp
    g++ -Wall -c -o $@ $<
0
ответ дан 4 December 2019 в 15:11
поделиться
Другие вопросы по тегам:

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