Почему мой makefile не создает объектные файлы?

Вот мой make-файл:

LIBS = libxml2.so.2.9.4 
LDFLAGS = -lstdc++ -lpthread -lxml2

vpath %.hpp ./
vpath %.cpp ./
vpath %.h ./libxml2/include/libxml

all: KeyGenerator

KeyGenerator: main.o ProjectXmlParser.o xmlparser.o
    g++ ${CXXFLAGS} ${LDFLAGS} -o KeyGenerator $+ ${LIBS}

main.o: main.cpp

ProjectXmlParser.o: ProjectXmlParser.cpp ProjectXmlParser.hpp

xmlparser.o: xmlparser.cpp xmlparser.hpp global.hpp

phony:  clean

clean: 
        rm -f *.o

Выход:

/usr/bin/make -f Makefile CONF=Debug
g++ -g -Wall -std=gnu++11 -pthread -I./ -I./src -I./libxml2/include -lstdc++ -lpthread -lxml2 -o KeyGenerator main.o ProjectXmlParser.o xmlparser.o libxml2.so.2.9.4 
g++: error: ProjectXmlParser.o: No such file or directory
g++: error: xmlparser.o: No such file or directory
Makefile:12: recipe for target 'KeyGenerator' failed
make: *** [KeyGenerator] Error 1

В каталоге проекта все мои файлы hpp и cpp находятся на одном уровне. У меня есть еще один проект под названием libxml, который я использую. Когда я делаю сборку, создается main.o, но ни один из файлов .o не создается. Я видел, как другие сообщения задают этот вопрос, но пока ничего не помогло мне.

Спасибо.


person B. Hoeper    schedule 26.11.2019    source источник
comment
Вы не определили рецепт создания объектных файлов   -  person Jacob    schedule 26.11.2019
comment
Какая строка в вашем make-файле, как вы ожидаете, вызовет генерацию отсутствующего файла .o и как?   -  person Yunnosch    schedule 26.11.2019
comment
Что произойдет, если вы закомментируете директивы vpath?   -  person Some programmer dude    schedule 26.11.2019
comment
@Jacob GNU Make использует для этого неявные правила.   -  person Some programmer dude    schedule 26.11.2019
comment
@Someprogrammerdude Если я закомментирую директивы vpath, я получу тот же результат.   -  person B. Hoeper    schedule 26.11.2019
comment
Основываясь на предоставленной вами информации, вы не должны получать эту ошибку, что означает, что что-то не так, о чем вы нам не сообщили. Либо make-файл здесь каким-то существенным образом отличается от вашего фактического make-файла, либо есть что-то довольно странное. Вы показали нам сообщение об ошибке, но не показали строки компиляции make run; они могут быть очень полезными. Кроме того, вы можете запустить make -d и изучить вывод, чтобы выяснить, как make обрабатывает файл ProjectXmlParser.o.   -  person MadScientist    schedule 26.11.2019
comment
@MadScientist Вот результат make -d: pastebin.com/eMuDDAkG   -  person B. Hoeper    schedule 26.11.2019


Ответы (1)


На основе вывода make -d:

Must remake target 'ProjectXmlParser.o'.
Successfully remade target file 'ProjectXmlParser.o'.

кажется, make считает, что у вас есть пустой рецепт для создания этой цели. Может быть, у вас есть какие-то случайные символы TAB в вашем make-файле после правил ProjectxXmlParser.o и xmlparser.o, которые не отображаются в make-файле, который вы вставили в этот вопрос?

person MadScientist    schedule 26.11.2019
comment
Ага... На пустой строке между xmlparser.o: xmlparser.cpp xmlparser.hpp global.hpp и фальшивкой: clean - person B. Hoeper; 26.11.2019
comment
Что видно при редактировании вопроса. Хороший улов! - person Some programmer dude; 26.11.2019
comment
Я ОЧЕНЬ ценю вас. - person B. Hoeper; 26.11.2019