我正在学习如何用g ++制作Makefile
。我使用以下example
该项目的代码是here。这是Makefile
# Makefile for Writing Make Files Example
# *****************************************************
# Variables to control Makefile operation
CXX = g++
CXXFLAGS = -Wall -g
# ****************************************************
# Targets needed to bring the executable up to date
main: main.o Point.o Rectangle.o # ***Statement : 1
$(CXX) $(CXXFLAGS) -o main main.o Point.o Rectangle.o #Commands underneath dependencies have tabs before them
# The main.o target can be written more simply
main.o: Point.h Rectangle.h # ***Statement : 2
$(CXX) $(CXXFLAGS) -c main.cpp
Point.o: Point.h # ***Statement : 3
Rectangle.o: Rectangle.h Point.h # ***Statement : 4
现在我对此有一些疑问,为了便于提问,我还使用了statement关键字引用了特定的行。
1-我的理解是否正确陈述1.当g ++在main之后遇到main.o(它是目标main.o的依赖)时,它跳转到目标main.0(语句2)。然后检查main.o的依赖关系是否依赖(找到两个头文件)然后运行命令。然后它返回完成下一个依赖项的任务等等?
2 - 对于Point.o的依赖,这是Point.h为什么没有这样的命令
$(CXX) $(CXXFLAGS) -c Point.cpp
和Rectangle.o类似,为什么没有这样的依赖命令
$(CXX)$(CXXFLAGS)-c Rectangle.cpp
如果有人能澄清这一点,我将不胜感激。
答案 0 :(得分:3)
正确。值得注意的是,gnu make
使用修改时间来确定是否满足依赖关系。
make
有implicit rules用于构建.o
目标。这些使用变量,例如$CXX
和$CXXFLAGS
。对于给定目标,例如foo.o
,make
将根据源文件foo.<ext>
的存在应用规则,从而创建目标依赖关系对foo.o : foo.<ext>
。如果扩展名是C ++版(例如.cpp
,.cc
,.C
),那么它将应用
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
您已为Point.o
指定了额外依赖。这将添加到隐式依赖项Point.cpp
中。如果Point.h
或Point.cpp
的修改时间比Point.o
更新,则会运行该规则。
正如@Basile在评论中指出的那样,您可以使用make
或-p
选项调用--print-data-base
以获取有关&#34;州&#34;的信息。 make,包括隐含规则。例如,将它与grep一起使用,我可以查询从C ++文件构建.o
文件的隐式规则:
make -p | grep -A 1 -B 1 COMPILE.cc
输出:
# default
COMPILE.cpp = $(COMPILE.cc)
# makefile (from `Makefile', line 1)
--
--
# default
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
# environment
--
--
# default
COMPILE.C = $(COMPILE.cc)
# environment
--
--
# commands to execute (built-in):
$(COMPILE.cc) $(OUTPUT_OPTION) $<
--
--
# commands to execute (built-in):
$(COMPILE.cc) $(OUTPUT_OPTION) $<
关于你扩展的规则,Point.o : Point.h
,这就是我的make版本会产生的:
make -p | grep -A 1 -B 1 Point
....
Point.o: Point.cpp Point.h
# Implicit rule search has been done.
....