[英]MakeFile in g++ . Ignorable commands
我正在学习如何在g ++中制作Makefile
。 我使用以下示例该项目的代码在这里 。这是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.h的Point.o的依赖性,为什么没有这样的命令
$(CXX) $(CXXFLAGS) -c Point.cpp
对于Rectangle.o同样如此,为什么没有这样的依赖关系命令
$(CXX)$(CXXFLAGS)-c Rectangle.cpp
如果有人可以澄清这一点,我将不胜感激。
正确。 值得注意的是,gnu make
使用修改时间来确定是否满足依赖性。
make
具有用于构建.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在注释中指出的那样,您可以使用-p
或--print-data-base
选项调用make
以获得有关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.
....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.