makefile: нет правила для создания цели "% .o" - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть 3 файла: Source. cpp 2ndfile. cpp 2ndfile.hpp И я пытаюсь скомпилировать их с помощью mingw32-make

makefile, который не работает:

all: launch.exe

launch.exe: %.o
    g++ -o $@ $^

%.o: %.cpp
    g++ -c $< -std=gnu++11

make-файл, который работает:

all: launch.exe

launch.exe: source.o 2ndfile.o
    g++ -o $@ $^

source.o: source.cpp
    g++ -c source.cpp -std=gnu++11

2ndfile.o: 2ndfile.cpp
    g++ -c 2ndfile.cpp -std=gnu++11

Мой вопрос: почему первый не работает? В чем моя проблема с шаблонами '%'? Я получаю ошибку: mingw32-make: *** No rule to make target '%.o', needed by 'launch.exe'. Stop.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Заменить% на *.

all: launch.exe

launch.exe: *.o
    g++ -o $@ $^

*.o: *.cpp
    g++ -c $^ -std=gnu++11

РЕДАКТИРОВАТЬ : ниже есть ответ, почему это плохая идея. Вот что работает:

all: launch.exe

launch.exe: Source.o 2ndfile.o
    g++ -o $@ $^

%.o: %.cpp
    g++ -c $^ -std=gnu++11
0 голосов
/ 03 апреля 2020

Мой вопрос : почему первый не работает? В чем моя проблема с шаблонами '%'?

Правило шаблона сопоставляет цели с предварительными условиями через общий элемент в их именах, представленный подстановочным знаком %. Вы представляете свой собственный пример в виде этого правила:

%.o: %.cpp
    g++ -c $< -std=gnu++11

С другой стороны, это правило ...

launch.exe: %.o
    g++ -o $@ $^

... это , а не шаблонное правило, поскольку целевое имя не содержит %. Там вы, похоже, пытаетесь использовать % в совершенно ином смысле, аналогично * в шаблоне глобуса. Это не служит этой цели, даже в шаблонных правилах. Это дало бы правилам паттернов совсем другое (и гораздо менее полезное) значение. Вместо этого в вашем не шаблонном правиле % обрабатывается как обычный символ.

Существует множество способов написания make-файлов, но хорошей, простой моделью для изучения правил шаблонов будет комбинация вашего первого и второго примеров:

all: launch.exe

launch.exe: source.o 2ndfile.o
    g++ -o $@ $^

%.o: %.cpp
    g++ -c $< -std=gnu++11
...