Foreach循环在Makefile中不起作用:“系统找不到指定的文件”

时间:2010-01-07 07:52:05

标签: makefile

我有以下内容的Makefile:

NUMBERS = 1 2 3 4
lib:
    $(foreach var,$(NUMBERS),./a.out $(var);)

这是我运行的命令(与Makefile在同一目录中)

make -f Makefile

但是我收到一条错误消息,说“系统找不到指定的文件”。

根据one of the answers的建议,我在与Makefile相同的目录中创建了以下文件:

a.out
1.out
2.out
3.out
4.out

现在错误变为:

  

./ a.out 1; ./a.out 2; ./a.out 3;   ./a.out 4; make(e = -1):错误-1 make:   *** [lib]错误-1

注意:我在Windows XP平台上运行

5 个答案:

答案 0 :(得分:3)

make的目的是通过运行命令来创建(和更新)依赖于源文件的目标文件。

这里,问题在于运行的命令。您正在尝试运行(通过make)命令a.out但它不存在,或者不是可执行命令。尝试通过您想要运行的实际可执行命令替换makefile中的a.out。

答案 1 :(得分:1)

在我看来,错误的发生是因为无法找到文件 a.out 而不是因为找不到makefile。

此外,如果makefile的名称是“Makefile”,只需调用“make”即可(不使用-f选项),因为默认情况下make会按名称查找文件:GNUmakefile,makefile和Makefile。

答案 2 :(得分:1)

在Windows / DOS上,使用&&代替;在一行上加入多个命令。您必须手动包含最终命令,否则尾随&&将引发语法错误。尝试类似:

NUMBERS = 1 2 3 4
lib:
    $(foreach var,$(NUMBERS),.\a.out $(var) && ) echo.

答案 3 :(得分:0)

你想做什么?

在我看来,普通脚本更适合而不是使用make。

答案 4 :(得分:0)

我发现 the answer by bta 最有用,但它在 Windows 和 Linux 上对我都不起作用,所以我找到了一种方法来删除最后的 &&,从而避免了不需要 -适用于两个平台的 op 命令:

NUMBERS = 1 2 3 4
lib:
    $(filter-out &&EOL, $(foreach var,$(NUMBERS), .\a.out $(var) &&)EOL)

当然要小心匹配 &&EOL 的数组中的元素,但就我而言,这不是问题。