Meu manuscrito C ++ Makefile dá o comando não encontrado

0

Eu fiz um makefile para ajudar a compilar múltiplos arquivos C ++, mas ele está me dando erros de "comando não encontrado". Alguém poderia me ajudar a consertar isso?

Os erros que recebo:

Make: line 1: main.out::command not found 
g++: error: GradeBook.o: No such file or directory 
g++: error: main.o: No such file or directory 
g++: fatal error: no input files 
compilation terminated. 
Make: line 4: main.o:: command not found 
Make: line 7: GradeBook.o:: command not found 
Make: line 10: clear:: command not found 

Aqui está o meu makefile:

main.out: GradeBook.o main.o
    g++ -Wall -g -o main.out GradeBook.o main.o 

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

GradeBook.o: GradeBook.cpp GradeBook.h
    g++ -Wall -g -c GradeBook.cpp

clean:
    rm -f main.out main.o GradeBook.o 
    
por Bruce 22.12.2013 / 01:38

2 respostas

6

Aqui está uma lista de erros típicos que as pessoas cometem com makefiles.

Problema nº 1 - usando espaços em vez de guias

O comando make é notoriamente exigente quanto à formatação em Makefile . Você desejará ter certeza de que a ação associada a um determinado destino seja prefixada por uma guia e não por espaços.

Este é um único Tab seguido pelo comando que você deseja executar para um determinado alvo.

Exemplo

Este é o seu alvo.

main.out: GradeBook.o main.o

O comando a seguir deve ter uma única aba na frente dela.

    g++ -Wall -g -o main.out GradeBook.o main.o 
^^^^--Tab

Aqui está o seu Makefile limpo

//Here is my makefile:

main.out: GradeBook.o main.o
        g++ -Wall -g -o main.out GradeBook.o main.o 

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

GradeBook.o: GradeBook.cpp GradeBook.h
        g++ -Wall -g -c GradeBook.cpp

clean:
        rm -f main.out main.o GradeBook.o 

Problema # 2 - nomeando errado

A ferramenta make está esperando que o arquivo seja chamado de Makefile . Qualquer outra coisa, você precisa dizer a make qual arquivo você quer usar.

$ make -f mafile

-or- 

$ make --file=makefile

-or-

$ make -f smurfy_makefile

OBSERVAÇÃO: Se você nomear seu arquivo Makefile , então poderá executar apenas o comando:

$ make

Problema # 3 - executando Makefiles

Makefile são arquivos de dados para o comando make . Eles não são executáveis.

Exemplo

torne-o executável

$ chmod +x makefile

execute

$ ./makefile 
./makefile: line 1: main.out:: command not found
g++: error: GradeBook.o: No such file or directory
g++: error: main.o: No such file or directory
g++: fatal error: no input files
compilation terminated.
./makefile: line 4: main.o:: command not found
g++: error: main.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
./makefile: line 7: GradeBook.o:: command not found
g++: error: GradeBook.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
./makefile: line 10: clean:: command not found

Outros isues

Além das dicas acima, eu também aconselho você a fazer uso pesado da capacidade de make de fazer "dry-runs" ou "test mode". Os interruptores:

   -n, --just-print, --dry-run, --recon
        Print the commands that would be executed, but do not execute them 
        (except in certain circumstances).

Exemplo

Executando o arquivo makefile .

$ make -n -f makefile 
g++ -Wall -g -c GradeBook.cpp
g++ -Wall -g -c main.cpp
g++ -Wall -g -o main.out GradeBook.o main.o 

Mas observe que nenhum dos arquivos resultantes foi realmente criado quando executamos isso:

$ ls -l
total 4
-rw-rw-r--. 1 saml saml   0 Dec 22 08:39 GradeBook.cpp
-rw-rw-r--. 1 saml saml   0 Dec 22 08:45 GradeBook.h
-rw-rw-r--. 1 saml saml   0 Dec 22 08:45 main.cpp
-rwxrwxr-x. 1 saml saml 262 Dec 22 08:25 makefile
    
por 22.12.2013 / 03:42
0

Nas mensagens de erro, parece que você está executando o Makefile como se fosse um executável ou script de shell (ou seja, você definiu o bit executável e executa ./Make ).

Não é assim que é feito. Você precisa invocar make para executar seu Makefile, por exemplo:

$ make -f Make

Ou, se você renomear seu arquivo para Makefile , basta digitar:

$ make
    
por 22.12.2013 / 09:05