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这是医生: