关于我的简单Makefile的问题

时间:2014-10-24 03:27:20

标签: c++ makefile

下面是我的Makefile的副本。我有几个问题 我的项目是here

CXX = g++
CXXFLAGS = -Wall -g

test:  car.o student.o   house.o main.o
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o

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 main.o car.o student.o house.o test

现在我的问题是:

问题1: 关于隐式Makefile规则,我有点困惑。 为什么Makefile工作正常,即使我替换

  main.o: student.h house.h    main.cpp

做完干净之后

  main.o: main.cpp

请有人澄清一下。

问题2: 如果test目标的依赖关系的顺序发生变化(我尝试了一些并且它没有),这是否重要?专家的确认会有所帮助。

test:  car.o student.o   house.o main.o

问题3: 当依赖项是没有命令的头文件时会发生什么,例如

student.o: student.h car.h

更新: 运行make -p后,这是我得到的一部分

house.o: house.cpp house.h
#  Implicit rule search has been done.
#  Implicit/static pattern stem: `house'
#  Last modified 2014-10-24 01:28:16.992760877
#  File has been updated.
#  Successfully updated.
# automatic
# @ := house.o
# automatic
# % := 
# automatic
# * := house
# automatic
# + := house.cpp house.h
# automatic
# | := 
# automatic
# < := house.cpp
# automatic
# ^ := house.cpp house.h
# automatic
# ? := house.cpp house.h
# variable set hash-table stats:
# Load=8/32=25%, Rehash=0, Collisions=2/20=10%
#  recipe to execute (built-in):
    $(COMPILE.cpp) $(OUTPUT_OPTION) $<

我对这意味着什么很困惑

2 个答案:

答案 0 :(得分:1)

您删除了之前有关此事的问题;即使您对其结果不满意,该体验也可能对另一个StackOverflow用户有用。请考虑在线重新提问。

问题1:Makefile工作正常,因为依赖关系尚未更新。请记住,Makefile提供初始构建以及后续的重建,从而加速后者,因为它只查看已更改的文件。在您的示例中,您最初表示main.o取决于几个头文件。然后你删除了两个依赖项。在您的软件开发周期中,您的头文件将被更改,如果下一个make未表示依赖关系,则main.o将不会相应更新。这是一个简单的例子,但它对大型软件项目有很大的影响,因为目标文件在旧版本中都存在。

问题2:不是小项目。在大型项目中,第一个指定的目标文件可能包含第二个指定的目标文件需要正确链接的符号;所以完整的答案是:不是在小项目中,但最好习惯它以用于未来的项目。

问题3:目标顺序无关紧要。

问题4:回声依赖于依赖:

test:  car.o student.o   house.o main.o
    echo "This is the test"
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o

答案 1 :(得分:1)

运行make -p以了解内置规则和变量。特别是你会得到(其中包括)

COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cpp = $(COMPILE.cc)
OUTPUT_OPTION = -o $@
%.o: %.cc
#  recipe to execute (built-in):
    $(COMPILE.cc) $(OUTPUT_OPTION) $<
%.o: %.cpp
#  recipe to execute (built-in):
    $(COMPILE.cpp) $(OUTPUT_OPTION) $<
顺便说一下,你也可以使用remake(与GNU make兼容)作为remake -x;它会显示更多正在发生的事情和原因。

使用最近的GNU make(4.0或更高版本),您还可以运行make --trace

另请参阅documentation of GNU make