我刚开始尝试在生成文件中同时使用静态模式规则和for循环,但在使用生成文件方面我还是相对较新,因此如果我错过了明显的内容,请原谅我。
在下面的代码中,我尝试使用for循环创建6个可执行文件,每个唯一文件两个。
这是makefile:
vpath %.h ../headers/
CXX := g++
CXXFLAGS := -std=c++11 -I../headers/
LDFLAGS :=
SUFFIX := fileA fileB fileC
memory-%.exe: primary-%.o memory.cpp
$(CXX) $(CXXFLAGS) $^ -o $@
timing-%.exe: primary-%.o timing.cpp
$(CXX) $(CXXFLAGS) $^ -o $@
all: for i in $(SUFFIX); \
do \
testing-$$i.exe: primary-$$i.o; \
memory-$$i.exe: primary-$$i.o; \
done
我遇到错误:
\bin\sh: 3: memory-fileA.exe:: not found
\bin\sh: 4: timing-fileA.exe:: not found
\bin\sh: 3: memory-fileB.exe:: not found
\bin\sh: 4: timing-fileB.exe:: not found
\bin\sh: 3: memory-fileC.exe:: not found
\bin\sh: 4: timing-fileC.exe:: not found
make: *** [all] Error 127
这甚至有可能吗?我只是想知道使用这种方法是否有效率。
我们非常感谢任何帮助,因为我想了解有关makefile文件允许的可能性的更多信息。 谢谢。
答案 0 :(得分:4)
您正在混合shell并进行构造。正如tripleee所指出的那样,make规则的配方是shell脚本,而不是其他make规则。
此外,Makefile存在一些问题:
CXXFLAGS
make变量非常不寻常。传统上,它仅限于编译器的标志,而不限于使用CXX
的编译器本身。c++11
的{{1}}选项对我来说是新的。您确定不是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 $@
规则是pattern rule。它告诉make如何从相应的C ++源文件生成任何目标文件。最后两个规则实际上是static pattern rules。例如,这两个中的第一个声明%.o: %.cpp...
中列出的每个目标testing-<suffix>.exe
取决于相应的$(TESTING)
和primary-<suffix>.o
。因此,此单一静态模式规则等效于以下3个简单规则:
memory.o
不需要循环。请注意,如果您正确使用标准的make变量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
和CXX
,则可以删除模式规则(CXXFLAGS
),它是众多implicit rules已经知道了。