sourcetip

Makefile:1: *** 구분 기호가 없습니다.이제 그만

fileupload 2023. 6. 7. 23:06
반응형

Makefile:1: *** 구분 기호가 없습니다.이제 그만

C에 프로젝트를 만들고 있는데 Makefile을 만들고 실행하려고 하면 다음 오류가 나타납니다.

Makefile:1: *** missing separator.  Stop.

내 메이크 파일 코드는 다음과 같습니다.

CC=gcc
OBJ=./objetos
INC=./include
FON=./aqsFonte
BIB=./bibliotecas
OPBIB=-lBiblioteca
ProjetoFinal: libFinal.a
    $(CP) $(FON)/ProjetoFinal.c -I$(INC) -L$(BIB) $(OPBIB) -o ProjetoFinal

Bibliotecas.a: Caminho.o Libs_Defines.o Matrizes.o Proc_Imagens.o Vetores.o
    ar -q $(BIB)/libFinal.a Caminho.o ibs_Defines.o Matrizes.o Proc_Imagens.o Vetores.o

Caminho.o:
    $(CP) $(FON)/Caminho.c -o Caminho.o
Libs_Defines.o :
    $(CP) $(FON)/Libs_Defines.c -o Libs_Defines.o
Matrizes.o:
    $(CP) $(FON)/Matrizes.c -o Matrizes.o
Proc_Imagens.o:
    $(CP) $(FON)/Proc_Imagens.c -o Proc_Imagens.o
Vetores.o:
    $(CP) $(FON)/Vetores.c -o Vetores.o

또한, 제 생각에는 모든 것이 정확하게 표시되어 있습니다.

탭 문제입니다.일부 텍스트 편집기는 탭을 공백으로 대체할 수 있으며, 이를 망치지 않는 적절한 텍스트 편집기를 사용해야 합니다.vi 또는 다른 기본 편집기에서 makefile을 열고 해당 makefile을 다시 작성합니다.

각 대상 규칙 뒤에 줄의 시작 부분에 하나의 탭을 배치해야 합니다.탭 다음에 오는 모든 항목은 셸로 전달됩니다. 탭, 공백 및 원하는 항목이 더 있을 수 있지만 줄의 시작 부분에는 탭이 있어야 합니다.

당신은 달리기를 시도할 수 있나요 -

perl -pi -e 's/^  */\t/' Makefile

(물론 백업을 저장한 후)

또한 .PHONY와 대상 사이의 결장이 누락되었기 때문일 수 있습니다.

.PHONY all 
all:
<tab><do this>

아래가 정상적으로 작동하는 동안 오류 발생

.PHONY: all 
all:
<tab><do this>

make는 규칙과 대상이 들여쓰기되는 방식에 매우 민감합니다.게시하는 오류는 일반적으로 단일 탭 대신 공백으로 대상 규칙을 들여쓰기 때문에 발생합니다.

예:

target:
    do stuff

오류가 발생하지만,

target:
<tab>do stuff

하지 않을 것이다.

는 vcode로 C++를 작성하고 있었는데 같은 문제에 직면했습니다.

문제는 vcode가 탭 대신 공백을 삽입한다는 것입니다. 텍스트 편집기도 동일하게 작업할 수 있지만 사용자가 눈치채지 못했습니다.

vscode를 사용하는 경우 이 행을 에 추가합니다.settings.json파일 이름:

// Will control if the editor will insert spaces for tabs. values = <"auto" | true | false>
"editor.insertSpaces": false,

그래도 문제가 해결되지 않으면 다른 텍스트 편집기(예: Vim, 메모장 등)에서 Makefile을 열고 거기서 탭을 삽입합니다. 그러면 해당 텍스트 편집기에서도 동일한 문제가 발생하지 않는 한 탭이 올바르게 삽입됩니다.


바운즈

vscode를 사용하는 경우 현재 문자가 공백인지 탭인지 선택하여 확인할 수 있습니다. 그러면 vscode는 다음을 나타냅니다.

  • 탭:
  • 공백:

vcode가 선택 중인 공간 및 탭을 나타내는 방법을 설명하는 사진

사실 나는 비슷한 문제에 직면했지만 모든 것이 옳다는 것을 나중에 이해했습니다. 나는 g-edit을 사용하여 솔루션을 알려줍니다. 편집 > 편의성 > 탭 > 버튼을 클릭합니다(탭 대신 공백 삽입). 그리고 그것은 잘 작동했습니다.

아마도 유니코드 표준을 이해하는 최신 텍스트 편집기를 사용하고 있을 것입니다. -- 이 편집기에서 ANSI 파일을 열어도 파일의 처음에 두 개의 "보이지 않는" 바이트를 배치한다는 점을 제외하고는 매우 역호환적인 UTF-8로 다시 저장합니다.다른 프로그램이 텍스트가 인코딩된 형식을 알 수 있도록 합니다. -- 이것이 "오류"가 1행에 보고되는 이유입니다.

Windows용 메모장을 사용하는 경우 이 동작을 재정의하고 파일을 "ANSI" 형식으로 저장할 수 있는 옵션이 있으므로 운이 좋습니다.방법:

  1. 파일 -> 다른 이름으로 저장
  2. 유형으로 저장을 "모든 파일"로 변경합니다.
  3. Makefile의 정확한 위치를 찾으십시오(때로는 다른 디렉토리에 저장하기도 합니다, 왜 이런 일이 일어났는지는 모르겠지만 저는 계속 발생했습니다).
  4. 파일 이름을 "Makefile"에서 "Makefile"로 변경합니다. 파일 이름이 없으면 "All Files"를 선택한 경우에도 "Makefile.txt"로 저장됩니다.
  5. 인코딩을 "UTF-8"에서 "ANSI"로 변경합니다.

    ANSI 인코딩으로 저장

자동 생성된 gcc makefile로 소스 코드를 작성할 때도 같은 문제가 발생합니다.

드디어 makefile 시작 부분에서 utf-8 BOM 캐릭터로 인해 발생한 것임을 알게 되었습니다.일부 텍스트 편집기에서는 이러한 문자를 볼 수 없습니다.

BOM 없이 utf-8로 파일을 저장해 보십시오.

언급URL : https://stackoverflow.com/questions/18936337/makefile1-missing-separator-stop

반응형