เหตุใด makefile ของฉันจึงไม่สร้างไฟล์อ็อบเจ็กต์

นี่คือ makefile ของฉัน:

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 ที่ฉันใช้อยู่ เมื่อฉันทำ build main.o จะถูกสร้างขึ้น แต่ไม่มีการสร้างไฟล์ .o เลย ฉันเคยเห็นโพสต์อื่นที่ทำให้เกิดคำถามนี้ แต่จนถึงขณะนี้ยังไม่มีอะไรได้ผลสำหรับฉัน

ขอบคุณ


person B. Hoeper    schedule 26.11.2019    source แหล่งที่มา
comment
คุณยังไม่ได้กำหนดสูตรสำหรับวิธีสร้างไฟล์อ็อบเจ็กต์   -  person Jacob    schedule 26.11.2019
comment
บรรทัดใดใน makefile ของคุณที่คุณคาดว่าจะทริกเกอร์การสร้างไฟล์ .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
จากข้อมูลที่คุณให้มา คุณไม่ควรได้รับข้อผิดพลาดนี้ ซึ่งหมายความว่ามีบางอย่างผิดปกติที่คุณไม่ได้แจ้งให้เราทราบ makefile ที่นี่มีความแตกต่างอย่างมีนัยสำคัญจาก makefile จริงของคุณ หรือมีบางอย่างที่ค่อนข้างแปลก คุณแสดงข้อความแสดงข้อผิดพลาดให้เราทราบ แต่คุณไม่ได้แสดงบรรทัดการคอมไพล์ที่ทำให้การรัน สิ่งเหล่านี้มีประโยชน์มาก นอกจากนี้ คุณยังสามารถรัน 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 หลงทางใน makefile ของคุณหลังจากกฎ ProjectxXmlParser.o และ xmlparser.o ซึ่งไม่แสดงใน makefile ที่คุณวางในคำถามนี้

person MadScientist    schedule 26.11.2019
comment
ใช่... มีแท็บบนบรรทัดว่างระหว่าง xmlparser.o: xmlparser.cpp xmlparser.hpp global.hpp และ phony: clean - person B. Hoeper; 26.11.2019
comment
ซึ่งจะเห็นได้เมื่อแก้ไขคำถาม จับดี! - person Some programmer dude; 26.11.2019
comment
ฉันซาบซึ้งคุณมาก - person B. Hoeper; 26.11.2019