【发布时间】:2018-12-04 23:58:35
【问题描述】:
我刚刚开始尝试在 makefile 中同时使用静态模式规则和 for 循环,我对使用 makefile 还是比较陌生,所以如果我遗漏了一些明显的东西,请原谅我。
在下面的代码中,我尝试使用 for 循环创建 6 个可执行文件,每个唯一文件两个。
这是生成文件:
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 允许的可能性。 谢谢你。
【问题讨论】:
-
仔细查看错误,\bin\sh: 3: memory-fileA.exe:: not found。请注意额外的冒号 (:),它是文件名的一部分。您是否有一个名为
memory-fileA.exe:的文件,其末尾有一个冒号 (:)?我打赌不会。testing-$$i.exe: primary-$$i.o中冒号的作用是什么?你的意思是,也许,testing-$$i.exe primary-$$i.o? -
该行的想法是遵循静态模式规则,以便创建文件“memory-fileA.exe”
-
配方中的每一行都由 shell 执行,而不是 Make 本身。您正在尝试的可能可以通过简单的
make函数来完成;在 GNU Make 文档中查找$(foreach ...)和$(patsubst ...)以及$(eval ...)。 -
@tripleee 我明白你在说什么,我觉得这将是一个好主意。如果我的意思是正确的,那就使用 $(foreach program, $(SUFFIX), $(eval $(patsubstr ...))) 但是我迷路了。我一直在环顾四周,但我不明白如何创建正确的命令来执行该过程。如果可能的话,你能引导我朝着正确的方向前进吗?对不起,我无法理解我在网上其他地方可以找到的内容。