【问题标题】:Foreach Loop Not Working in Makefile: "The system cannot find the file specified"Foreach 循环在 Makefile 中不起作用:“系统找不到指定的文件”
【发布时间】:2010-01-07 07:52:04
【问题描述】:

我有一个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;制作(e = -1):错误-1制作: *** [lib] 错误 -1

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

【问题讨论】:

  • 您可以尝试在 shell 提示符下自己运行./a.out 1; ./a.out 2; ./a.out 3; ./a.out 4;,而不是运行make。也许它会显示更多有用的错误消息。

标签: makefile


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 Windows/DOS 上,使用 && 而不是 ; 在一行中连接多个命令。您必须手动包含最终命令,否则结尾的 && 将引发语法错误。尝试类似:

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

    【讨论】:

      【解决方案3】:

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

      此外,如果您的 makefile 的名称是“Makefile”,只需调用“make”就足够了(不使用 -f 选项),因为 make 默认会按名称查找文件:GNUmakefile、makefile 和 Makefile 按此顺序。

      【讨论】:

      • 我在makefile所在的文件夹下创建了a.out,但还是有问题。
      • 注意a.out必须是可执行文件。
      【解决方案4】:

      你到底想做什么?

      在我看来,纯脚本比使用 make 更适合。

      【讨论】:

      • 这是我想做的一个按比例缩小的例子。
      【解决方案5】:

      我发现the answer by bta 最有用,但它在 Windows 和 Linux 上都不适用于我,所以我找到了一种方法来删除最终的 &&,这样就不需要一个有效的无操作命令在两个平台上:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 2018-12-22
        • 1970-01-01
        • 2019-08-03
        • 2014-03-16
        • 1970-01-01
        • 2013-11-21
        相关资源
        最近更新 更多