Вы смешиваете оболочку и строите конструкции.Как указывало tripleee , рецепты правил make являются сценариями оболочки, а не другими правилами make.
Более того, у вашего Makefile есть несколько проблем:
- Youобъясните, что вы хотите использовать статические шаблонные правила , но вы написали " simple " шаблонные правила .
- Вам не нужно заключать в кавычкиваши суффиксы.И не стоит, делать не оболочку, она их сохраняет.Из-за этого вы получите ошибки.
- Использование стандартной переменной make
CXXFLAGS
крайне необычно.Традиционно он ограничен флагами компилятора, а не самим компилятором, для которого используется CXX
. - Вы компилируете исходные файлы и выполняете компоновку одновременно.Это тоже не так уж обычно.Это приводит к бесполезным перекомпиляциям.
- Опция
c++11
для g++
является новой для меня.Вы уверены, что это не -std=c++11
? - Директива
vpath
бесполезна, поскольку вы не выражаете зависимости от заголовочных файлов.Но давайте сохраним, я думаю, вы не все показываете.
В целом, вы, вероятно, можете достичь желаемого с помощью:
vpath %.h ../headers/
CXX := g++
CXXFLAGS := -std=c++11 -I../headers/
LDFLAGS :=
SUFFIX := fileA fileB fileC
TESTING := $(patsubst %,testing-%.exe,$(SUFFIX))
MEMORY := $(patsubst %,memory-%.exe,$(SUFFIX))
.PHONY: all
all: $(TESTING) $(MEMORY)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $^ -o $@
$(TESTING): testing-%.exe: primary-%.o memory.o
$(CXX) $(LDFLAGS) $^ -o $@
$(MEMORY): memory-%.exe: primary-%.o timing.o
$(CXX) $(LDFLAGS) $^ -o $@
%.o: %.cpp...
правило - это шаблонное правило .Он говорит make, как создать любой объектный файл из соответствующего исходного файла C ++.Два последних правила на самом деле статические шаблонные правила .Например, первый из двух объявляет, что каждая цель testing-<suffix>.exe
, указанная в $(TESTING)
, зависит от соответствующих primary-<suffix>.o
и memory.o
.Таким образом, это единственное правило статического шаблона эквивалентно этим 3 простым правилам:
testing-fileA.exe: primary-fileA.o memory.o
g++ primary-fileA.o memory.o -o testing-fileA.exe
testing-fileB.exe: primary-fileB.o memory.o
g++ primary-fileB.o memory.o -o testing-fileB.exe
testing-fileC.exe: primary-fileC.o memory.o
g++ primary-fileC.o memory.o -o testing-fileC.exe
Нет необходимости в циклах.Обратите внимание: если вы правильно используете стандартные переменные make CXX
и CXXFLAGS
, вы можете отбросить правило шаблона (%.o: %.cpp...
), это одно из многих неявных правил , которое make уже знает.