Makefile循环:“command not found error”在循环开始前弹出,但随后工作正常

Makefile循环:“command not found error”在循环开始前弹出,但随后工作正常,makefile,Makefile,我想运行一个输入大小不断增加的程序,所以我引入了一个包含循环的运行目标 run: input_size = 1000 ; while [[ $$input_size -le 10000 ]] ; do \ echo $$input_size ; \ ./main.out $$input_size ; \ ((input_size = input_size + 1000)) ; \ done 我得到以下错误: /bin/sh: in

我想运行一个输入大小不断增加的程序,所以我引入了一个包含循环的运行目标

run:
    input_size = 1000 ; while [[ $$input_size -le 10000 ]] ; do \
        echo $$input_size ; \
        ./main.out $$input_size ; \
        ((input_size = input_size + 1000)) ; \
    done
我得到以下错误:

/bin/sh: input_size: command not found
之后,循环按预期工作。

在bash中,赋值符号周围不得有空格,这与make不同:

或者,您可以使用bash算术展开,它对空格更为宽松:

SHELL := /bin/bash

run:
    for (( input_size = 1000; input_size < 10000; input_size += 1000 )); do \
        echo $$input_size; \
    done
在bash中,赋值符号周围不得有空格,这与make不同:

或者,您可以使用bash算术展开,它对空格更为宽松:

SHELL := /bin/bash

run:
    for (( input_size = 1000; input_size < 10000; input_size += 1000 )); do \
        echo $$input_size; \
    done

您的makefile有几个问题,如果我们修复了您的版本,它应该是:

run:
    input_size=1000 ; while [ $$input_size -le 10000 ] ; do \
        echo $$input_size ; \
        ./main_out $$input_size ; \
        input_size=$$((input_size + 1000)) ; \
    done
生成数字序列的更简单方法是使用seq:


您的makefile有几个问题,如果我们修复了您的版本,它应该是:

run:
    input_size=1000 ; while [ $$input_size -le 10000 ] ; do \
        echo $$input_size ; \
        ./main_out $$input_size ; \
        input_size=$$((input_size + 1000)) ; \
    done
生成数字序列的更简单方法是使用seq:


只是为了明确你的问题:

问题是make不会使用用户拥有的任何shell来运行配方:这对于可重复构建来说是一场灾难。make always by the POSIX standard在作为POSIX shell的/bin/sh shell中运行配方

您的食谱使用的是bashshell的增强功能,这在posixshell中是不可用的。您需要重写您的配方以使用POSIX外壳特性,或者明确请求使用bash而不是POSIX外壳来运行您的配方。当然,这意味着您的makefile无法移植到任何bash不可用的系统,如果这是一个问题的话

您可以通过将以下内容添加到makefile来执行后一种操作:

SHELL := /bin/bash

只是为了明确你的问题:

问题是make不会使用用户拥有的任何shell来运行配方:这对于可重复构建来说是一场灾难。make always by the POSIX standard在作为POSIX shell的/bin/sh shell中运行配方

您的食谱使用的是bashshell的增强功能,这在posixshell中是不可用的。您需要重写您的配方以使用POSIX外壳特性,或者明确请求使用bash而不是POSIX外壳来运行您的配方。当然,这意味着您的makefile无法移植到任何bash不可用的系统,如果这是一个问题的话

您可以通过将以下内容添加到makefile来执行后一种操作:

SHELL := /bin/bash

你想在这里解决什么问题?看起来不像是makefile的正常用法。shell脚本可能更合适。顺便说一句:这与C语言毫无关系。你想在这里解决什么问题?看起来不像是makefile的正常用法。shell脚本可能更合适。顺便说一句:这与C语言无关。非常感谢!这帮助我获得了更清晰的代码。有没有办法抑制从将输出带到控制台的循环?@NikhilCSB只需在第一个字符之前放置一个@,即@input_size..../bin/sh:“@input_size”:不是有效标识使用make-s抑制输出。尽管如此,它并没有抑制被调用程序的输出,这正是我所需要的。非常感谢!这帮助我获得了更清晰的代码。有没有办法抑制从将输出带到控制台的循环?@NikhilCSB只需在第一个字符之前放置一个@,即@input_size..../bin/sh:“@input_size”:不是有效标识使用make-s抑制输出。尽管如此,它并没有抑制被调用程序的输出,这正是我所需要的。非常感谢!这帮助我获得了更清晰的代码。我得到了意外的文件结尾。ONESHELL:@NikhilCSB我想你的评论放错地方了。我建议你试试我的例子。对不起,哪个例子?@NikhilCSB这是医生:非常感谢!这帮助我获得了更清晰的代码。我得到了意外的文件结尾。ONESHELL:@NikhilCSB我想你的评论放错地方了。我建议你试试我的例子。对不起,哪个例子?@NikhilCSB这是医生: