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