2009-05-24 2 views
14

Вопрос, вероятно, не самый лучший, чтобы описать мою проблему, но я не мог придумать лучшего. Мой make-файл выглядит примерно так:Как правильно сделать мой makefile для компиляции и запуска?

PROGRAM_NAME = prog 

OBJECT_FILES = $(PROGRAM_NAME).o 
CFLAGS = -O2 -Wall -g 

$(PROGRAM_NAME) : $(OBJECT_FILES) 
    gcc $(CFLAGS) -o [email protected] $(OBJECT_FILES) 

$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h 
    gcc $(CFLAGS) -c $< 

clean : 
    $(RM) $(PROGRAM_NAME) 
    $(RM) $(OBJECT_FILES) 
    $(RM) *~ *.bak 

run : 
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS) 

Когда я хочу скомпилировать и запустить, я просто делаю «make run». Проблема в том, что моя программа обрабатывает сигнал, созданный Ctrl + Z, и если я запустил свою программу с «make run», сигнал будет отправлен на «make run», а не на мою программу.

В основном, называя «сделать бег» не то же самое, как вызов непосредственно «сделать & & ./prog», потому что в первом случае, «сделать прогон» не закончится, если «прога» не заканчивается первым.

Есть ли способ обойти это?

ответ

12

Запуск из файла makefile немного необычен. Возможно, вы пытаетесь дублировать пункт меню «Скомпилировать и запустить», который предоставляет некоторые IDE? У Марка недостаточно хорошо для этого.

Все, что происходит в целевых командах, происходит в подпроцессах, которые не подключены непосредственно к терминалу, поэтому make получает ваш ключевой штрих.

Еще одна вещь, на которую нужно обратить внимание: обычно объект-файл на исполняемый этап (связывание) использует другой набор флагов (LDFLAGS и LIBS), затем этап компиляции. В этом простом примере вы можете уйти от него, но если вы скопируете этот make-файл для использования в более сложном случае, у вас возникнут проблемы.

+0

Я лучше не использовать его таким образом, то ... :) –

3

Как сказал ответ dmckee, make (1) что-то делает, а не для компиляции и запуска.

Конечно, ничто не мешает вам для создания Shell псевдонима макияжа прогонов который делает предполагаемым «сделать & & ./prog арга.

13

Вы можете упростить «запустить» цель, имея это зависит от того, что ваша программа в актуальном состоянии, а затем просто запустить программу:

run: ${PROGRAM_NAME} 
     ./${PROGRAM} ${ARGS} 

Там нет особого смысла в управлении make, когда вы уже работает make - по крайней мере, не в этом контексте. Возможно, для рекурсивных операций (в разных каталогах), но см. 'Recursive Make Considered Harmful'.

Кроме того, ваш make-файл обычно должен обеспечивать цель «all», и это должно быть обычно первая и, следовательно, цель по умолчанию.

4

Если вы собираетесь построить и запустить снова и снова, вы можете использовать команду history, чтобы помочь с этим:

# Run this once 
make && ./foo 

# Repeat last command 
!! 
+2

Даже лучше , в Bash вы можете использовать '! make', чтобы повторить последнюю команду, начинающуюся с« make », даже если вы запускаете другие команды между ними. Этот рабочий процесс очень хорошо работает для меня. –