使用makefile运行带有输入的可执行文件

使用makefile运行带有输入的可执行文件,makefile,Makefile,我有以下生成文件: CC=g++ CFLAGS=-I. tiling_file=blocking.cpp sequential_file=sequential.cpp n1 = 100 n2=7 n3=4 all: tiling sequential run tiling: $(CC) $(tiling_file) -fopenmp -o block sequential: $(CC) $(sequential_file) -fopenmp -o seq run:

我有以下生成文件:

CC=g++
CFLAGS=-I.
tiling_file=blocking.cpp
sequential_file=sequential.cpp
n1 = 100
n2=7 
n3=4

all: tiling sequential run
tiling:
    $(CC) $(tiling_file) -fopenmp -o block

sequential: 
    $(CC) $(sequential_file) -fopenmp -o seq

run:
    ./block $(n1) $(n2) $(n3)
块可执行文件接受三个输入(由n1、n2、n3指定)

g++ blocking.cpp -fopenmp -o block
g++ sequential.cpp -fopenmp -o seq
./block 100 7 4 
除非我再次键入10074并按enter键,否则可执行文件不会接受输入。 我如何运行它

除非我再次键入10074并按enter键,否则可执行文件不会接受输入。我如何运行它

该可执行文件可能希望在其标准输入中包含数据,而不是命令行参数:

run:
    echo "$(n1) $(n2) $(n3)" | ./block 

对于运行可执行文件,我通常有以下规则:

run_% : %
    echo "${$*.stdin}" | ./$< ${$*.args}
.PHONY: run_%
然后像这样调用make:

make run_mytest

另一点是,你的食谱必须产生他们承诺产生的文件。目前,它承诺构建一个名为
tiling
的文件,但构建一个名为
block
的文件

修正:

tiling:
    $(CC) $(tiling_file) -fopenmp -o $@

sequential: 
    $(CC) $(sequential_file) -fopenmp -o $@

在上面的
$@
代表目标名称,
tiling
sequential
分别对应。

这可能只是我的观点,但我不喜欢运行目标的makefile。make的工作是构建目标。如果您想在一个步骤中构建和运行,您可以创建一个bash脚本,它可以
生成目标&&./target p1 p2
,等等。这基本上是语义——make的目的是构建一些东西,而脚本的目的是运行一些东西。从make运行的一个警告是,make中的环境可能有一些意外的设置(与您期望的不同的shell,不同的路径等),这是我可以想到的。当从命令行运行与make运行时,这可能会导致不同的行为。@John所有这些警告同样适用于shell脚本,不是吗?
tiling:
    $(CC) $(tiling_file) -fopenmp -o $@

sequential: 
    $(CC) $(sequential_file) -fopenmp -o $@