make :`all '을 위해 할 일이 없습니다.


98

예를 들어 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'.

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


12
"make clean"다음에 "make all"을 시도하십시오
Paul R

11
이는 오류가 아니라 hello최신 상태 임을 의미 합니다. 변경 cleanrm -f *.o hello예기치 않은 무언가를하기 전에, 다음 실행 make clean all하고 작동되는지 확인합니다.
Mat

1
또한 추가해야 .phony: all clean하기 때문에, all그리고 clean파일 이름이 아니다.
Kerrek SB

3
CFLAGS에 -c를 넣지 마십시오.
wildplasser 2011

답변:


122

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

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

대신에

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

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


obj-m + = hello.o all : </ t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) 모듈 정리 : make -C / lib / modules / $ ( 쉘 끝나면 uname -r) / 빌드 M = $ (PWD) 청소
나렌드라 Jaggi

위의 파일이 유효한 파일입니까 ??
Narendra Jaggi 2015 년

부모-자식 메이크 파일의 맥락에서, 때때로 자식 타겟이 부모 메이크 파일에서 .PHONY로 잘못 표시되어 "아무것도 수행되지 않음"오류가 발생할 수 있습니다.
donhector

나는 그것을 가지고 all : src/server/mod_wsgi.la변경했다 all : </t> src/server/mod_wsgi.la. 지금 오류를 얻을 : make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127sudo make. 도움이 필요하세요?
Mooncrater

@Mooncrater 참조 gnu.org/software/make/manual/make.html#Rule-Syntax . 레시피 라인은 탭 문자 (또는 .RECIPEPREFIX 변수 값의 첫 번째 문자, 특수 변수 참조)로 시작합니다. 첫 번째 레시피 라인은 전제 조건 뒤의 라인에 탭 문자와 함께 표시되거나 세미콜론으로 동일한 라인에 표시 될 수 있습니다. 어느 쪽이든 효과는 동일합니다. 따라서 전제 조건은 단순히 레시피가되었습니다. 이 경우 탭이 필요하지 않습니다.
VirtualVDX

31

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

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


obj-m + = hello.o all : </ t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) 모듈 정리 : make -C / lib / modules / $ ( 쉘 끝나면 uname -r) / 빌드 M = $ (PWD) 청소
나렌드라 Jaggi

위의 파일이 유효한 make 파일입니까?
Narendra Jaggi

21

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

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

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

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


16

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

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

4

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


4

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

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


0

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

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.