2016-11-22 30 views
0

運行帶有輸入的可執行文件,我有以下生成文件:,利用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: 
    ./block $(n1) $(n2) $(n3) 

塊可執行發生在三個輸入(由N1,N2,N3指定)。然而當我執行使我得到以下輸出

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

可執行文件不接受輸入,除非我再次輸入100 7 4並按回車鍵。 我該如何運行它?

回答

1

可執行文件不接受輸入,除非我再次輸入100 7 4並按回車。我該如何運行它?

該可執行文件可能是在它的標準輸入,而不是命令行參數預計數據:

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的文件。

修正:

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

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

在上述[email protected]代表目標名稱,tilingsequential相應。

+0

這可能只是我的看法,但我並不熱衷於運行目標的makefile。 make的工作就是構建目標。如果你想一步一步構建並運行,你可以創建一個bash腳本來實現'make target && ./target p1 p2'等。 – John

+0

@Jonh你的限制解決了什麼問題? –

+0

它基本上是語義 - make的目的是建立一些東西,而腳本的目的是運行東西。從我的腦海裏想出的一個警告是,make中的環境可能有一些意想不到的設置(不同於你期望的shell,不同的路徑等)。這可能會導致從命令行與make進行運行時出現不同的行爲。 – John