繁体   English   中英

g ++中的MakeFile。 无知的命令

[英]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

如果有人可以澄清这一点,我将不胜感激。

  1. 正确。 值得注意的是,gnu make使用修改时间来确定是否满足依赖性。

  2. make具有用于构建.o目标的隐式规则 这些使用变量,例如$CXX$CXXFLAGS 对于给定的目标,例如foo.omake将根据源文件foo.<ext>的存在情况应用规则,从而创建目标依赖对foo.o : foo.<ext> 如果扩展名是C ++扩展名(例如.cpp.cc.C ),则它将沿

    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

您已经为Point.o指定了额外的依赖关系 这将添加到隐式依赖项Point.cpp 如果任何的修改时间Point.hPoint.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM