[c] make :`all ‘을 위해 할 일이 없습니다.

예를 들어 pgm을 통해 make 파일을 만들겠습니다.

http://mrbook.org/tutorials/make/

내 폴더 eg_make_creation에는 다음 파일이 포함되어 있습니다.

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

Makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

오류:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

이 프로그램을 컴파일하는 것을 이해하도록 도와주세요.



답변

때때로 “모두에 대해 수행 할 작업이 없습니다”오류가 탭 대신 메이크 파일 규칙의 명령 앞에 공백으로 인해 발생할 수 있습니다. 규칙 내부에 공백 대신 탭을 사용해야합니다.

all:
<\t>$(CC) $(CFLAGS) ...

대신에

all:
    $(CC) $(CFLAGS) ...

규칙 구문 설명은 GNU make 매뉴얼을 참조하십시오 : https://www.gnu.org/software/make/manual/make.html#Rule-Syntax


답변

hello폴더 에서 파일을 제거하고 다시 시도하십시오.

all대상은에 따라 hello대상입니다. hello목표는 먼저 파일 시스템에서 해당 파일을 찾습니다. 이를 발견하고 종속 파일이 최신 상태 인 경우 수행 할 작업이 없습니다.


답변

make를 제공하면 makefile의 첫 번째 규칙, 즉 “all”이됩니다. “all”이 main.o, factorial.o 및 hello.o에 의존하는 “hello”에 종속되도록 지정했습니다. 따라서 ‘make’는 해당 파일이 있는지 확인합니다.

만약 존재한다면, ‘make’는 그들의 의존성 (예 : main.o에 의존성 main.c가 있음)이 변경되었는지 확인합니다. 변경된 경우 make는 다시 빌드하고 그렇지 않으면 규칙을 건너 뜁니다. 마찬가지로 변경된 파일을 재귀 적으로 빌드하고 마지막으로 최상위 명령 인 “all”을 실행하여 실행 가능한 ‘hello’를 제공합니다.

존재하지 않는 경우 make는 규칙에 따라 모든 것을 맹목적으로 구축합니다.

문제에 관해서는 오류가 아니지만 ‘make’는 makefile의 모든 종속성이 최신 상태이며 아무것도 만들 필요가 없다는 것을 말합니다!


답변

Make가 올바르게 작동합니다. hello이미 존재하고 .c파일 보다 오래되지 않았 으므로 더 이상 수행 할 작업이 없습니다. make가 (재) 빌드해야하는 네 가지 시나리오가 있습니다.

  • .c파일 중 하나를 수정하면 보다 최신 파일 hello이되며 make를 실행할 때 다시 빌드해야합니다.
  • 을 삭제 hello하면 당연히 다시 빌드해야합니다.
  • -B옵션으로 모든 것을 다시 빌드하도록 make를 강제 할 수 있습니다 .make -B all
  • make clean all삭제 hello하고 다시 빌드해야합니다. (@Mat의 의견을 살펴볼 것을 제안합니다.rm -f *.o hello


답변

9 번째 줄에서 탭을 놓친 것 같습니다. all : hello 다음 행 은 빈 탭이어야합니다. 9 번째 줄에 빈 탭이 있는지 확인하십시오. 인터프리터가 makefile에 기본 레시피를 사용하고 싶다는 것을 이해하게합니다.


답변

그것은 오류가 아닙니다. 유닉스의 make 명령은 타임 스탬프를 기반으로 작동합니다. 즉, 특정 변경을 수행 factorial.cpp하고 컴파일을 사용하여 컴파일 make하면 cc -o factorial.cpp명령 만 실행 된다는 정보가 표시됩니다 . 다음 번에 동일한 명령을 실행하면 즉 확장자 make가있는 파일을 변경하지 않고 .cpp컴파일러는 출력 파일이 최신 상태라고 말합니다. 컴파일러는 file.cpp.

의 장점 makefile은 수정 된 파일 만 컴파일 .o하고 수정되지 않은 파일 의 오브젝트 ( ) 파일을 직접 사용하여 재 컴파일 시간을 단축한다는 것 입니다.


답변

나는 다른 경로를 통해이 독특하고 디버그하기 어려운 오류에 도달했습니다. 내 문제는 대상과 종속성이 별개의 디렉토리에있을 때 빌드 단계에서 패턴 규칙을 사용하고 있다는 것입니다. 이 같은:

foo/apple.o: bar/apple.c $(FOODEPS)

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

이런 식으로 몇 가지 종속성을 설정했으며 모두에 대해 하나의 패턴 레시피를 사용하려고했습니다. 분명히 “%”에 대한 단일 대체는 여기서 작동하지 않을 것입니다. 나는 각 의존성에 대해 명시적인 규칙을 만들었고, 나는 강아지와 유니콘 사이에서 돌아왔다!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

이것이 누군가를 돕기를 바랍니다!