Нужна помощь в понимании правила шаблона makefile%:% .o - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу превратить этот make-файл во что-то более простое, используя правила шаблонов, о которых я читал в книге:

VPATH = src
CPPFLAGS = -I include

main.o: main.cpp
    g++ $(CPPFLAGS) $<
TwoDimensionalShape.o: TwoDimensionalShape.cpp
    g++ -c $(CPPFLAGS) $<
Square.o: Square.cpp Square.h
    g++ -c $(CPPFLAGS) $<
Circle.o: Circle.cpp Circle.h
    g++ -c $(CPPFLAGS) $<
Rectangle.o: Rectangle.cpp Rectangle.h
    g++ -c $(CPPFLAGS) $<
Triangle.o: Triangle.cpp Triangle.h
    g++ -c $(CPPFLAGS) $<
ShapeStack.o: ShapeStack.cpp ShapeStack.h
    g++ -c $(CPPFLAGS) $<
ScreenManager.o: ScreenManager.cpp ScreenManager.h
    g++ -c $(CPPFLAGS) $<
ScreenState.o: ScreenState.cpp ScreenState.h
    g++ -c $(CPPFLAGS) $<
SquareState.o: SquareState.cpp SquareState.h
    g++ -c $(CPPFLAGS) $<
CircleState.o: CircleState.cpp CircleState.h
    g++ -c $(CPPFLAGS) $<

После прочтения книги я могу написать вышеизложенное с использованием шаблонных правил, подобных этому. Но я не понимаю, как это работает:

#source files are in "src" folder.
VPATH = src
#header files are in "include" folder.
CPPFLAGS = -I include -Wall

all: main.o TwoDimensionalShape.o Square.o Circle.o Rectangle.o Triangle.o ShapeStack.o ScreenManager.o ScreenState.o SquareState.o CircleState.o
    g++ $(CPPFLAGS) $^

%.o: %.cpp
    g++ -c $(CPPFLAGS) $<

%: %.o
    g++ $<

Этот make-файл правильный, но я не понимаю, как он работает.

  1. Если я изменю, например, 2 исходных файла, как этот make-файл понимает компиляцию только измененных двух исходных файлов, а не всех исходных файлов?
  2. В книге, которую я читал, пример был о C, а не C ++, а последняя строка была %: %.c. Тогда почему моя линия, которая %: %.o работает? Разве это не должно быть %: %.cpp?

1 Ответ

0 голосов
/ 25 апреля 2018

Этот make-файл правильный, но я не понимаю, как он работает.

Если ваш новый Makefile является заменой старого, он определенно НЕ работает.

В вашем "старом" файле, например,

ShapeStack.o: ShapeStack.cpp ShapeStack.h

который говорит, что ShapeStack.o зависит от .cpp и заголовочного файла.Ваш новый Makefile не имел никаких зависимостей от других файлов, что приведет к большим проблемам.Просто коснитесь одного из ваших заголовков и введите make.Ничего не произойдет!

Так что, как минимум, вам нужно ввести зависимости исходного файла, возможно, вручную, как в вашем старом make-файле, или с некоторым другим автоматом, который использует проверку зависимостей от компилятора, используя gcc это с "gcc"-MM ".

Для получения автоматизированных предварительных условий см. https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html

. Использование vpath может привести к большим проблемам.Есть несколько статей, например: http://make.mad -scientist.net / paper / how-not-to-use-vpath /

Некоторые примеры Makefile можно найти уже здесь: минимальный c ++ make файл для linux

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...