'구분 기호 누락(TAB을 의미했나요?)'에 대한 불만

'구분 기호 누락(TAB을 의미했나요?)'에 대한 불만

파일 을 설치하려고 할 때 som_pak-3.1-NAcMoS.tar.gz다음 명령을 사용했습니다.

$ tar xvf som_pak-3.1-NAcMoS.tar.gz
$ cd som_pak-3.1
$ cp makefile.unix makefile
$ make
$ cd ..
$ ln -s som_pak-3.1 $NACMOS_HOME/som_pak

그러나 make명령을 실행하는 동안 다음 오류가 발생합니다.

*구분 기호가 누락되었습니다(공백 8개가 아니라 TAB을 의미했나요?). 멈추다.

  • 누구든지 오류의 원인을 말해 줄 수 있습니까?
  • 포함해야 할 패키지가 있나요?

답변1

발생한 오류:

*** 구분 기호 누락(공백 8개가 아니라 TAB을 의미했나요?). 멈추다.

makefile탭 대신 공백이 포함되어 있음을 의미합니다 . 이 유틸리티는 대체 make사용에 대해 매우 까다로운 것으로 알려져 있습니다 . 따라서 파일 내의 규칙 섹션 시작 부분에 포함될 가능성이 높습니다 .SpaceTabmakefileSpace

다음과 같은 3개의 파일이 있다고 가정해 보겠습니다 .c.

안녕하세요 c
char *
hello() 
{
  return "Hello";
}
world.c
char *
world() 
{
  return "world";
}
메인 프로그램:
#include <stdio.h>

/* Prototypes. */
char *hello();
char *world();

int
main(int argc, char *argv[]) 
{
    printf("%s, %s!\n", hello(), world());
    return 0;
}    

다음이 있다고 가정해 보겠습니다 Makefile.

# The executable 'helloworld' depends on all 3 object files
helloworld: main.o hello.o world.o
        cc -o helloworld main.o hello.o world.o # Line starts with TAB!

# Build main.o (only requires main.c to exist)
main.o: main.c
        cc -c main.c # Line starts with TAB!

# Build hello.o (only requires hello.c to exist)
hello.o: hello.c
        cc -c hello.c # Line starts with TAB!

# Build world.o (only requires world.c to exist)
world.o: world.c
        cc -c world.c # Line starts with TAB!

#  Remove object files, executables (UNIX/Windows), Emacs backup files, 
#+ and core files
clean:
        rm -rf  *.o helloworld *~ *.core core # Line starts with TAB!

이제 타겟을 생성해 보겠습니다.

내가 목표물에 대해 실행할 때 helloworld:

$ make helloworld
makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

낯익어 보이나요?

문제를 풀다

Spaces실제 문자로 변경하여 Tab이 문제를 해결할 수 있습니다. 한번은 vim파일을 복구한 적이 있습니다. 그냥 열어보세요:

$ vim makefile

그런 다음 다음에서 이 명령을 실행합니다.

:%s/^[ ]\+/^I/

노트: ^I특수 문자입니다. ^나중에 입력하면 + - + 와 I다르게 해석됩니다 .CtrlVCtrlI

이렇게 하면 1 이상으로 시작하는 모든 줄이 Spaces실제 줄로 대체됩니다 Tab.

이제 목표를 다시 실행하면 다음과 같습니다 helloworld.

$ make helloworld
cc -c main.c # Line starts with TAB!
cc -c hello.c # Line starts with TAB!
cc -c world.c # Line starts with TAB!
cc -o helloworld main.o hello.o world.o # Line starts with TAB!

인용하다

답변2

다른 답변에서 제안했듯이 Makefile은 공백 문자가 아닌 탭 문자를 기대합니다. 모든 탭 문자를 공백으로 자동 바꾸도록 설정했기 .vimrc때문에 다양한 Makefile에서 반대 설정을 수동으로 설정해야 합니다. 내가 사용하는 명령은 vim다음과 같습니다.

:%s/^[ ]\+/\t/g

답변3

참고: 이 특정 문제를 처리하는 올바른 방법은 각 레시피의 각 작업 줄이 단일 탭으로 들여쓰기되도록 Makefile을 수정한 다음 원래 개발자에게 패치를 제출하는 것입니다.

최신 버전의 GNU에서 작동하는 추악한 해킹은 다음과 같습니다 make(Makefile이 항상 탭 대신 공백을 사용하는 것이 문제인 경우).

make '.RECIPEPREFIX+='

이는 특수 GNU make변수를 .RECIPEPREFIX단일 공백으로 설정합니다. GNU 3.82(2007)부터 이 변수는 make레시피 조치 행의 접두어에 사용되는 문자를 제어합니다. 변수가 비어 있으면(기본값) 탭 문자가 사용됩니다.

예,

$ cat Makefile
all:
  echo hello
$ make '.RECIPEPREFIX+='
echo hello
hello

사용법을 보여주는 예 >(이 경우 Makefile 내부에 변수를 설정):

$ cat Makefile
.RECIPEPREFIX = >
all:
> echo hello
$ make
echo hello
hello

또한보십시오:

답변4

내 문제는 내가 가지고 있다는 것입니다

.PHONY foo

그리고 나는 그랬어야 했어

.PHONY: foo

이 오류가 발생합니다.

❯ make foo
Makefile:1: *** missing separator.  Stop.

관련 정보