gcc makefile 오류 :“대상을 만들 규칙이 없습니다…”


355

내 프로젝트를 컴파일하기 위해 makefile과 함께 GCC (linux)를 사용하려고합니다.

이 컨텍스트에서 해독 할 수없는 다음과 같은 오류가 발생합니다.

"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."

이것은 makefile입니다.

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

main.o: main.cpp main.h
    g++ -c main.cpp

vertex.o: vertex.cpp vertex.h
    g++ -c vertex.cpp

edge.o: edge.cpp edge.h
    g++ -c num.cpp

vlist.o: vlist.cpp vlist.h
    g++ -c vlist.cpp

elist.o: elist.cpp elist.h
    g++ -c elist.cpp

vnode.o: vnode.cpp vnode.h
    g++ -c vnode.cpp

enode.o: enode.cpp enode.h
    g++ -c node.cpp

2
소스 파일 '존재하지 않음'을 '만들'는 일반적인 예는 VPATH 또는 SRC 변수를 실수로 추가해야하는 경우 실수로 재설정하는 것입니다. VPATH=대신에 usnig 를 의미 VPATH+=합니다. 이렇게하면 파일이 실제로있을 때 Makefile 파일에서 파일을 볼 수 없습니다.
Chan Kim

답변:


424

일반적으로 vertex.cpp사용할 수 있는 파일이 없기 때문 입니다. 다음을 확인하십시오.

  • 해당 파일이 존재합니다.
  • 당신이 만들 때 당신은 올바른 디렉토리에 있습니다.

그 외에는 제안 할 것이 많지 않습니다. 해당 디렉토리의 디렉토리 목록을 제공 할 수 있습니다.


2
예, 일부 클래스에는 .cpp 파일이 없으므로 오류가 발생하지 않았습니다. 감사.
Meir

4
거기에 당신이 제거 몇 가지 헤더 파일을하지만 당신의 메이크하고 있으면 당신은 또한 같은 오류를 얻을 수
ADY

@par, 그것은 다른 질문처럼 보입니다. 당신이 경우 당신은 아마 더 노출을 얻을 수 있습니다 에게 질문로.
paxdiablo

또한, Makefile을 편집 한 후에 저장했는지 확인하십시오. 모든 편집 작업을 수행 한 다음 CTRL + S를 누르는 것을 잊었습니다.
Tim

80

내 경험상이 오류는 종종 철자 오류로 인해 발생합니다.

오늘이 오류가 발생했습니다.

make [1] : *** 대상 maintenaceDialog.cpp', needed bymaintenaceDialog.o ' 를 만드는 규칙이 없습니다 . 중지.

제 경우에는 오류가 단순히 철자 오류였습니다. MAINTENANCE라는 단어가 누락되었습니다. 세 번째 N입니다.

또한 파일 이름의 철자를 확인하십시오.


2
메타 이유 는이 경우 개체 / 소스 / 헤더 관계를 명시 적으로 나열하기 때문입니다. SubCons 또는 CMake 와 같은 최신 도구 를 맛보지 않으면 gcc -MT gnu make 패턴으로 해결할 수 있습니다. 참고 .
Nathan Kidd

당신은 내 하루를 구했다! 감사합니다! :)
Sunit Gautam

내 경우에는 경로가 잘못 ../../src/file.c되었지만 실제로는../../src/folder/file.c
Rasmi Ranjan Nayak

31

이 메시지가 인쇄되는 가장 일반적인 이유는 소스 파일이있는 디렉토리를 포함하지 않았기 때문입니다. 결과적으로 gcc는이 파일이 존재하지 않습니다.

gcc에 -I 인수를 사용하여 디렉토리를 추가 할 수 있습니다.


14

필자의 경우에는 머리를 쉼표로 구분 기호로 사용했습니다. 귀하의 예를 사용하려면 다음과 같이하십시오.

a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

다음과 동등한 것으로 변경

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

고쳤다.


11

정확히 맞습니까? Makefile 구문은 공백을 인식하며 작업에서 명령을 들여 쓰려면 탭이 필요합니다.


7

내가 찾은 문제는 다른 사람들이 언급 한 것보다 훨씬 어리 석었습니다.

우리의 makefile은 빌드 할 것들의 목록을 전달받습니다. TheOtherLibrary아래와 같이 누군가 목록 중 하나에 추가되었습니다 .

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

그들은 이것을 했어야했다 :

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

그들이 두 번째 방법으로 해냈다면 Library빌드를 지우지 않았을 것 입니다. 플러스 인 +=은 매우 중요합니다.


6

필자의 경우 Makefile의 여러 줄 규칙 오류로 인한 것입니다. 나는 다음과 같은 것을 가지고 있었다 :

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o \
OBJS-$(CONFIG_OBJ2)            += file5.o 
OBJS-$(CONFIG_OBJ3)            += file6.o
...

CONFIG_OBJ1규칙 에서 파일 목록 끝의 백 슬래시로 인해이 오류가 발생했습니다. 다음과 같아야합니다.

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o
OBJS-$(CONFIG_OBJ2)            += file5.o
...

5

빈번한 실수 중 하나는 다른 파일 이름의 오타 일 수 있습니다 .

당신의 예는 매우 간단하지만 때때로 혼동 될 수있는 것은 make그 자체의 메시지입니다 . 예를 고려해 봅시다.

내 폴더 내용은 다음과 같습니다

$ ls -1
another_file
index.md
makefile

makefile모습은

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo $@ $<

내가 가진 않지만 index.md이 있어야 할 곳에 그것의 이름에 실수가없는,의 메시지가 make될 것입니다

make: *** No rule to make target `index.html', needed by `all'.  Stop.

솔직히 말해서 메시지가 혼란 스럽다 . 그냥 규칙이 없다고 말합니다. 실제로 이는 규칙이 잘못되었음을 의미하지만 와일드 카드 (패턴) 규칙으로 make인해 문제의 원인을 정확히 파악할 수 없습니다.

makefile패턴을 명시 적 규칙으로 바꾸는 것을 조금 바꿔 보자 .

index.html: index.md wrong_path_to_another_file

이제 우리가받는 메시지는 다음과 같습니다.

make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.

기적! 다음과 같은 결론을 내릴 수 있습니다.

  • 메시지는 make규칙 에 따라 다르며 항상 문제의 근본을 가리키는 것은 아닙니다.

  • makefile이 메시지에 지정된 것과 다른 문제가있을 수 있습니다.

이제 우리는 규칙에 따라 다른 의존성검사 하는 아이디어를 생각해 냈습니다 .

all: index.html

%.html: %.md another_file
    @echo $@ $<

이것만으로 원하는 결과를 얻을 수 있습니다.

$ make
index.html index.md

3

필자의 경우 오류 메시지는 이름이 바뀌어 더 이상 존재하지 않는 이전 파일 이름을 나타냅니다. 오래된 정보는 Makefile이 아니라 .deps디렉토리의 파일에서 나온 것으로 나타났습니다 .

한 컴퓨터에서 다른 컴퓨터로 파일을 복사 한 후이 오류가 발생했습니다. 이 프로세스에서 타임 스탬프가 일관성이없는 상태에 있다고 가정합니다 . 작업은 여러 작업을 병렬로 실행할 때 ( 이 버그 보고서 와 유사) "make"를 혼동했습니다 .

순차적 빌드 make -j 1는 영향을받지 않았지만 별칭 ( make -j 8)을 사용하고 있었기 때문에 시간이 걸렸습니다 .

상태를 정리하기 위해 모든 .deps파일을 제거 하고 Makefile을 재생성했습니다. 다음은 내가 사용한 명령입니다.

find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure

그 후, 건물은 다시 일했습니다.


2

John the Ripper "bleeding-jumbo"를 만들려고하면 "make : *** 'linux-x86-64'대상을 만들 규칙이 없습니다"와 같은 오류가 발생합니다. 대신이 명령을 실행하십시오 :./configure && make


0

필자의 경우 소스 및 / 또는 이전 객체 파일이 반 크래시 IDE 또는 올바르게 작동하지 않는 백업 클라우드 서비스에 의해 잠겼습니다 (읽기 전용). 폴더 구조와 관련된 모든 프로그램 및 서비스를 다시 시작하면 문제가 해결되었습니다.


0

이상한 문제와 해결책의 또 다른 예 :

이:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

제공합니다 : make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

그러나 제거 Poco_LIBRARIES하면 작동합니다.

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

Mac에서는 clang8을, Linux에서는 clang 3.9를 사용하고 있습니다. 문제는 Linux에서만 발생하지만 Mac에서는 작동합니다!

나는 언급을 잊었다 : Poco_LIBRARIES틀렸다 – cmake / find_package에 의해 설정되지 않았다!


0

필자의 경우 경로가 VPATH에 설정되어 있지 않고 오류가 사라진 후에 추가되었습니다.


0

이 오류에는 여러 가지 이유가 있습니다.

이 오류가 발생한 이유 중 하나는 Linux 및 Windows를 빌드하는 중입니다.

BaseClass.h SubClass.h Unix는 대문자와 파일 이름 규칙을 유지하고 창은 대소 문자를 구분하지 않습니다.

사람들이 헤더 파일 이름에 대문자를 사용하지 않는 이유는 무엇입니까?

gmake를 사용하는 경우 gmake clean을 사용하여 깨끗한 빌드를 컴파일하십시오.

일부 텍스트 편집기에는 대소 문자 구분 파일 이름을 무시하도록 기본 설정이 있습니다. 또한 같은 오류가 발생할 수 있습니다.

Qt Creator에서 이름이 대문자로 시작하는 c ++ 파일을 추가하는 방법은 무엇입니까? 자동으로 작은 글자로 만듭니다


0

이 오류는 git 저장소에 새 파일을 추가하는 것을 잊었을 때 Travis 내에서 발생했습니다. 어리석은 실수이지만, 나는 그것이 매우 흔하다는 것을 알 수 있습니다.


-1

필자의 경우 Makefile을 호출했기 때문입니다. MAKEFILE (모든 대문자)

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