C++ 为了理解正在发生的事情。请注意:您在上面说它可能是一个文件或目标。make不是这样工作的:它将每个先决条件都视为一个目标。如果make找不到更新目标的适用规则,并且目标文件存在,则make将考虑“构建”目标并继续运行。这就是像car.h这样的文件的处理方式

C++ 为了理解正在发生的事情。请注意:您在上面说它可能是一个文件或目标。make不是这样工作的:它将每个先决条件都视为一个目标。如果make找不到更新目标的适用规则,并且目标文件存在,则make将考虑“构建”目标并继续运行。这就是像car.h这样的文件的处理方式,c++,makefile,g++,C++,Makefile,G++,为了理解正在发生的事情。请注意:您在上面说它可能是一个文件或目标。make不是这样工作的:它将每个先决条件都视为一个目标。如果make找不到更新目标的适用规则,并且目标文件存在,则make将考虑“构建”目标并继续运行。这就是像car.h这样的文件的处理方式。运行make-p来找出内置规则。规则make--trace或使用asremake-x来理解正在发生的事情。请注意:您可以在上面说它可能是一个文件或目标。make不是这样工作的:它将每个先决条件都视为一个目标。如果make找不到更新目标的适用规


为了理解正在发生的事情。请注意:您在上面说它可能是一个文件或目标。make不是这样工作的:它将每个先决条件都视为一个目标。如果make找不到更新目标的适用规则,并且目标文件存在,则make将考虑“构建”目标并继续运行。这就是像
car.h
这样的文件的处理方式。运行
make-p
来找出内置规则。规则
make--trace
或使用as
remake-x
来理解正在发生的事情。请注意:您可以在上面说它可能是一个文件或目标。make不是这样工作的:它将每个先决条件都视为一个目标。如果make找不到更新目标的适用规则,并且目标文件存在,则make将考虑“构建”目标并继续运行。这就是像
car.h
这样的文件的处理方式。感谢您的解释,但是您能否解释一下
.cc.o:
$*.o
在规则中的含义感谢您的精彩解释。我不得不同意保罗的回答。你的解释肯定有帮助。再次感谢您扩展您的答案,感谢您的解释。不过,请您解释一下规则中
.cc.o:
$*.o
的含义,谢谢您的精彩解释。我不得不同意保罗的回答。你的解释肯定有帮助。再次感谢您将答案扩展到make手册的一个非常旧的版本,这有什么原因吗?因此,如果我在
main.o:student.h house.h
中只使用依赖项
student.h
,而不添加命令“$(CXX)$(cxflags)-c main.cpp`那么make只需自己添加这些命令(如果它们丢失)?@MistyD make有一个预构建的规则,知道如何从.cpp文件生成.o。当它看到它需要生成一个.o文件时,它会查找它可以用来满足该要求的任何文件。首先,它在您自己的规则中查找,然后在内置规则中查找。它查找main.cpp并调用将.cpp转换为.o的规则。如果您有一个main.c文件,它将调用规则将.c文件转换为.o文件。我相信他们正在赠送他们关于gnu make的书。这是一本旧书,但make多年来没有太大变化。即使是前几章也会让你深入了解它的工作原理,并提高你对makefiles的理解。规则选择顺序不是那么简单,在make 3.82中也发生了更改(我相信)。您链接到make手册的一个非常旧的版本有什么原因吗?因此,如果我在
main.o:student.h house.h
中只使用依赖项
student.h
,而不添加命令“$(CXX)$(cxflags)-c main.cpp`那么make只需自己添加这些命令(如果它们丢失)?@MistyD make有一个预构建的规则,知道如何从.cpp文件生成.o。当它看到它需要生成一个.o文件时,它会查找它可以用来满足该要求的任何文件。首先,它在您自己的规则中查找,然后在内置规则中查找。它查找main.cpp并调用将.cpp转换为.o的规则。如果您有一个main.c文件,它将调用规则将.c文件转换为.o文件。我相信他们正在赠送他们关于gnu make的书。这是一本旧书,但make多年来没有太大变化。即使是前几章也会让你深入了解它的工作原理,并提高你对makefiles的理解。规则选择顺序并不是那么简单,在make 3.82(我相信)中进行了更改。
# *****************************************************
# Variables to control Makefile operation

CXX = g++
CXXFLAGS = -Wall -g


test:  main.o car.o student.o   house.o 
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o
    objcopy --only-keep-debug test test.debug   

main.o: student.h house.h  main.cpp
    $(CXX) $(CXXFLAGS) -c main.cpp

car.o: car.h

student.o: student.h car.h

house.o: house.h 

clean:
    rm -rf *.o test *.debug
%.o : %.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
main.o: student.h house.h    main.cpp
    $(CXX) $(CXXFLAGS) -c main.cpp
main.o: student.h house.h
test:  main.o car.o student.o   house.o 
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o
test:  main.o car.o student.o   house.o
.c.o:
    $(CC) $(CFLAGS) -o $*.o -c $*.c

.cc.o:
    $(CXX) $(CXXFLAGS) -o $*.o -c $*.cc