Makefile 만들기 [닫기]

Makefile 만들기 [닫기]

컴파일할 Makefile을 만드는 방법을 알고 싶습니다 hello.c.

// for example

int main(int argc, char *argv[]) {
    puts("Hello world");
    return 0;
}

나는 도움을 받아 프로그램을 컴파일하고 실행 했다는 것을 알고 있지만 gcc hello.c -o hello그것이 지금까지 내가 아는 전부입니다.

답변1

GNU make에는 매우 중요한 기능이 있습니다.온라인 매뉴얼, 제 생각에는 여러 면에서 짜증나고 둔감하지만 좋은 참고 자료가 됩니다. 다른 사람들이 말했듯이 자신에게 맞는 튜토리얼을 찾아보고 매뉴얼을 참조하여 구성 방법 등에 대해 숙지하세요.

빌드를 위한 기본(GNU make) makefile은 hello.c다음과 같습니다.

CFLAGS += -Wall -g -O0
PROGS = hello

.PHONY: clean

%: %.c
    $(CC) $(CFLAGS) $< -o $@

clean:
    -rm $(PROGS)

$(CC)내장 변수;재정의하지 않으면 기본값은 이고 cc, GNU 시스템에서는 심볼릭 링크가 됩니다 gcc. %을 나타냅니다패턴 규칙;이 경우 일치합니다.아무것, 그러나 디렉토리에 없으면 레시피가 anything.c실패합니다. $<그리고$@자동변수. 따라서 지금 실행하면:

make hello

Make는 다음을 실행합니다:

cc -Wall -g -O0 hello.c -o hello

`$(CFLAGS)와 함께 사용하면 +=다음과 같은 작업을 수행할 수 있습니다.

CFLAGS="--std=c99" make hello   

따라서 공백으로 구분하여 -Wall -g -O0에 추가됩니다 . --std=c99참고 make CFLAGS="--std=c99" hello해서 사용하시면바꾸다makefile의 모든 정의.

규칙은 세 가지 기본 부분으로 구성됩니다.표적, 이것전제 조건,게다가레시피(이봐). 이 규칙은 다음과 같은 상황에서 실행됩니다.

  • 대상 파일이 존재하지 않습니다.
  • 대상 파일이 필수 구성 요소 중 하나보다 오래되었습니다.

.PHONY그럼에도 불구하고 대상은 실행됩니다. 따라서 make clean위의 make 파일을 사용하여 실행하면 다음이 실행됩니다.

rm hello

이 경우에는 $(PROGS)다른 곳에서는 사용되지 않지만 더 복잡한 프로젝트 make files에서는 다른 작업의 전제 조건으로 사용될 수 있습니다. 예를 들어, 이 규칙을 맨 위(변수 선언 뒤)에 추가하면 다음과 같습니다.

all: $(PROGS)

목록에 추가하면 all지금 .PHONY:바로 입력할 수 make있으며 목록의 모든 항목은 $(PROGS)해당 규칙을 사용하여 작성됩니다 %: %.c. 이는 make의 전제 조건 all이고 all파일의 첫 번째 규칙이기 때문입니다. 지정하지 않으면 기본적으로 사용됩니다(즉, make hello"hello" 프로그램을 빌드하는 데 계속 사용할 수 있습니다).

답변2

적합한 Makefile을 생성하려면 다음 두 가지 사항이 충족되어야 합니다.

  • 매크로
  • 규칙

우리는 Makefile의 매크로를 사용하여 구문을 단축하고 파일 변경 시 편집을 더 쉽게 만듭니다. 예를 들어:

C = gcc # sets the macro for the C compiler to C

그래서 $(C)교체가 가능해요gcc

규칙은 파일 및 해당 종속성에 대한 변경 사항을 확인하는 데 사용됩니다. 항상 런타임 all시 먼저 확인되는 규칙이 있어야 합니다 . C 프로그램과 마찬가지로 함수가 먼저 실행됩니다.makeallmain()

메이크파일 예:

C = gcc
CFLAGS = -o
INPUT = hello
OUT = $(INPUT)

all: $(INPUT)

$(OUT): $(INPUT).c
        $(C) $(INPUT).cpp $(CFLAGS) $(OUT)

규칙 은 이름 + 세미콜론(예: do_this:)을 제공하고 그 뒤에 종속 파일이나 규칙을 추가한 후(예: another_rule $(DEPENDANDTFILE)) TAB 다음 줄에 명령을 추가하여 선언할 수 있습니다.

참고: 명령문 줄 시작 부분에 TAB이 없으면 규칙이 작동하지 않습니다.

관련 정보