2015-09-16 3 views
2

Следующая моя Makefile для компиляции несколько основных C++ файлов в исполняемый файл:C++ Makefile не создает необходимый файл .o

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 *~ 

Однако, когда я бегу make, при попытке компиляции prog3.cc, в нем говорится:

g ++: testtrie.o: Нет такого файла или каталога.

Я не могу за жизнь мне понять, почему он не делает testtrie.o ...

Заранее спасибо за вашу помощь!

ответ

1

Это потому, что ваш исполняемый файл (testtrie) зависит сверху тестtrie.o.

По умолчанию компилятор (г ++ в нашем случае), при компиляции исходного файла (например, src.cc), если -o не дается выходной файл объекта будет совпадать с именем исходного файла, так что будет src.o. Ваш testtrie.o мишень никогда не генерируется; вместо prog3.o является:

testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc 
    g++ $(OPTS) prog3.cc 

Изменить команду:

g++ $(OPTS) -o [email protected] prog3.cc 
3

Ваше testtrie.o правило:

testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc 
    g++ $(OPTS) prog3.cc 

ли на самом деле не строить testtrie.o, он строит prog3.o.

(Он также имеет несколько предварительных условий исходные файлы, которые он на самом деле не использовать, если вы делаете некоторые нездоровые вещи, например, #include.)

1

Правило для целевого testtrie.o должен построить testtrie.o файл так:

testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc 
    g++ $(OPTS) prog3.cc -o testtrie.o 

Вы можете также добавьте automatic variable[email protected], чтобы узнать имя выходного файла на основе целевого имени:

testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc 
    g++ $(OPTS) prog3.cc -o [email protected] 

Оба варианта будут иметь такой же эффект. Кроме того, не исправлять оставшиеся цели таким же образом.

Смежные вопросы