2016-11-22 2 views
0

У меня есть следующие 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: 
    ./block $(n1) $(n2) $(n3) 

блок исполняемым принимает три входа (как указано n1, n2, n3) .Однако, когда я выполняю сделать, я получаю следующее 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.

Исправления:

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

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

В приведенных выше [email protected] стендов для целевого имени, tiling и sequential соответственно.

+0

Это может быть только мое мнение, но я не заинтересован в make-файлах, которые запускают их цели. Задача make - построить цель. Если вы хотите создать и запустить за один шаг, вы можете создать сценарий bash, который делает «make target && ./target p1 p2» и т. Д. – John

+0

@Jonh Какая проблема решается? –

+0

Это в основном семантика - цель make состоит в том, чтобы что-то строить, а цель скриптов - запускать вещи. Одно из предостережений от того, что я могу думать о моей голове, состоит в том, что среда в make может иметь некоторые неожиданные настройки (другая оболочка, чем вы ожидаете, другой путь и т. Д.). Это может привести к различным типам поведения при запуске из командной строки vs make. – John

Смежные вопросы