使用可变文件名时找不到文件

时间:2018-12-04 23:58:35

标签: makefile sh

我刚开始尝试在生成文件中同时使用静态模式规则和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文件允许的可能性的更多信息。 谢谢。

1 个答案:

答案 0 :(得分:4)

您正在混合shell并进行构造。正如tripleee所指出的那样,make规则的配方是shell脚本,而不是其他make规则。

此外,Makefile存在一些问题:

  1. 您解释说要使用static pattern rules,但是写的是“ 简单pattern rules
  2. 您无需引用后缀。而且您不应该,make不是外壳,而是保留它们。因此,您将得到错误。
  3. 您使用标准CXXFLAGS make变量非常不寻常。传统上,它仅限于编译器的标志,而不限于使用CXX的编译器本身。
  4. 您正在编译源文件并同时链接。这也不是平常的。它会导致无用的重新编译。
  5. c++11的{​​{1}}选项对我来说是新的。您确定不是g++吗?
  6. -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已经知道了。