Мой вопрос : почему первый не работает? В чем моя проблема с шаблонами '%'?
Правило шаблона сопоставляет цели с предварительными условиями через общий элемент в их именах, представленный подстановочным знаком %
. Вы представляете свой собственный пример в виде этого правила:
%.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