2016-11-22 10 views
0

を使用して入力して実行ファイルを実行している:私は実行時に私は、次のメイク持っメイク

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で指定).However、私は次をプレゼントouput

g++ blocking.cpp -fopenmp -o block 
g++ sequential.cpp -fopenmp -o seq 
./block 100 7 4 

実行可能ファイルは、100 7 4をもう一度入力してEnterを押すまで入力を受け付けません。 どうすれば実行できますか?

答えて

1

実行可能ファイルは、100 7 4をもう一度入力してEnterキーを押すまで入力を受け付けません。どのように私はそれを実行できますか?おそらく実行可能

その標準入力ではなく、コマンドライン引数でデータを期待:

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

私は正常に実行ファイルを実行するための次のルールを持っているでしょう:

run_% : % 
    echo "${$*.stdin}" | ./$< ${$*.args} 
.PHONY: run_% 

そして、実行可能ファイルを定義します:

mytest : # something that builds mytest executable 
mytest.stdin := "this goes into the standard input of mytest" 
mytest.args := --verbose --dry-run 

そして、このようにする呼び出し:

make run_mytest 

もう一つのポイントは、あなたのレシピは、彼らが生成することを約束したファイルを生成しなければならないということです。現在、tilingという名前のファイルを作成することを約束していますが、代わりにblockという名前のファイルを作成します。

修正:ターゲット名、相応tilingsequentialため上記[email protected]スタンドで

tiling: 
    $(CC) $(tiling_file) -fopenmp -o [email protected] 

sequential: 
    $(CC) $(sequential_file) -fopenmp -o [email protected] 

+0

これは私の意見かもしれませんが、私は目標を実行するメイクファイルに熱心ではありません。 makeの仕事は、ターゲットを構築することです。 1つのステップでビルドして実行したい場合は、 'make target && ./target p1 p2'などを実行するbashスクリプトを作成できます。 – John

+0

@Jonhあなたの制限はどのような問題を解決しますか? –

+0

基本的には意味論です。makeの目的は何かを構築することです。スクリプトの目的は物事を実行することです。私が頭の上から外すことができると思うmakeから走っていることの1つの警告は、makeの環境に予期しない設定があるかもしれないということです。これは、コマンドラインからmakeを実行するときに、異なる動作につながる可能性があります。 – John