2009-05-24 4 views
14

질문은 아마도 내 문제를 설명하는 데 가장 좋은 질문이 아니지만 더 나은 의견을 생각할 수 없습니다. 제 메이크 파일은 다음과 같습니다 :제대로 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) 

"실행"하면됩니다. 이 문제는 내 프로그램이 Ctrl + Z로 생성 된 신호를 처리하고 "실행"으로 프로그램을 시작하면 신호가 내 프로그램 자체가 아닌 "실행"으로 전송된다는 것입니다.

는 기본적으로 "실행을"호출하면 "음식물은"첫째 종료하지 않는 한 종료되지 않습니다 "실행을"때문에 첫 번째 경우에 "& & ./prog '이라고합니다"직접 호출과 같은 것은 아니다.

이 방법이 있습니까?

답변

12

makefile에서 실행하는 것이 약간 이상합니다. 아마도 IDE에서 제공하는 "컴파일 및 실행"메뉴 항목을 복제하려고합니까? make는 그렇게 할 준비가 잘되어 있지 않습니다.

대상 명령에서 발생하는 모든 작업은 터미널에 직접 연결되지 않은 하위 프로세스에서 발생하므로 make가 키 입력을받는 이유입니다.

또 다른 사항 : 일반적으로 실행 가능 단계 (링크)의 오브젝트 파일은 컴파일 단계에서 다른 플래그 집합 (LDFLAGSLIBS)을 사용합니다. 이 간단한 예제에서 벗어날 수는 있지만 더 복잡한 경우에 사용하기 위해이 makefile을 복사하면 문제가 발생합니다.

+0

내가 더 잘 사용하지 이런 식으로 다음 ... :) –

3

dmckee의 답변에 따르면 make (1)은 컴파일 및 실행이 아닌 무언가를 만들고 있습니다. 물론

은 아무것도 '가 & & ./prog'이라고 인수을 '은 쉘에게 별칭 메이크업 실행 의도하지를 만드는 당신을 중지하지 않습니다. 당신이있을 때 많은 포인트가 make을 실행에이 아니다

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

:

13

당신은 단순히 프로그램을 실행 한 후이 프로그램이 최신 버전인지에 따라 달라함으로써 당신의 '실행'대상을 단순화 할 수 있습니다 이미 make을 실행 중입니다. 적어도이 컨텍스트에서는 아닙니다. 재귀 연산 (다른 디렉토리에서) 일 수도 있지만 'Recursive Make Considered Harmful'을 참조하십시오.

또한 makefile은 일반적으로 'all'이라는 대상을 제공해야하며 일반적으로 첫 번째 목표이므로 기본 대상이어야합니다.

4

구축하고 반복 실행 위하여려고하는 경우에, 당신은이에 도움이되는 history 명령을 사용할 수 있습니다

# Run this once 
make && ./foo 

# Repeat last command 
!! 
+2

더 나은 , Bash에서는 중간에 다른 명령을 실행하더라도'! make'를 사용하여 "make"로 시작하는 마지막 명령을 반복 할 수 있습니다. 그 워크 플로우는 나를 위해 아주 잘 작동합니다. –

관련 문제