A seguir, é apresentado meu makefile para compilar alguns arquivos C ++ básicos em um executável:
OBJ= node.o link.o trie.o testtrie.o
OPTS= -g -c -Wall -Werror
testtrie: $(OBJ)
g++ -o testtrie $(OBJ)
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc
trie.o: trie.cc trie.h
g++ $(OPTS) trie.cc
link.o: link.cc link.h
g++ $(OPTS) link.cc
node.o: node.cc node.h
g++ $(OPTS) node.cc
clean:
rm -f *.o *~
No entanto, quando corro make
, ao tentar compilar o prog3.cc, ele diz:
g ++: testtrie.o: Esse arquivo ou diretório não existe.
Pela minha vida, não consigo descobrir por que ele não faz testtrie.o ...
Agradeço antecipadamente por sua ajuda!
Respostas:
1 para resposta № 1Isso ocorre porque o seu executável (testtrie) depende de testtrie.o.
Por padrão, um compilador (g ++ no nosso caso) ao compilar um arquivo de origem (por exemplo, src.cc) E se -o não é fornecido, o arquivo do objeto de saída corresponderá ao nome do arquivo de origem; portanto, será src.o. Seu testtrie.o o alvo nunca é gerado; em vez de prog3.o é:
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc
Modifique o comando para:
g++ $(OPTS) -o $@ prog3.cc
3 para resposta № 2
Seu testtrie.o
regra:
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc
Na verdade, não cria testtrie.o
, constrói prog3.o
.
(Ele também possui vários arquivos de origem de pré-requisito que ele realmente não usa, a menos que você esteja fazendo algumas coisas prejudiciais com, por exemplo, #include
.)
1 para resposta № 3
A regra para o destino testtrie.o
deve construir um testtrie.o
arquivo como este:
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc -o testtrie.o
Você também pode adicionar um variável automática $@
para fazer com que ele reconheça o nome do arquivo de saída com base no nome do destino:
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc -o $@
Ambas as versões terão o mesmo efeito. Além disso, lembre-se de corrigir os demais alvos da mesma maneira.