/ / C ++ makefile não criando um arquivo .o necessário - c ++, makefile

C ++ makefile não criando um arquivo .o necessário - c ++, makefile

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 № 1

Isso 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.