在g++中生成文件.可忽略的命令

MakeFile in g++ . Ignorable commands

本文关键字:可忽略 命令 文件 g++      更新时间:2023-10-16

我正在学习如何在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

现在我对此有一些问题,为了便于提问,我还引用了使用语句关键字的特定行。

1-我对陈述1的理解正确吗。当g++在main之后遇到main.o(它是targetmain.o的依赖项)时:它跳到targetmain.0(语句2)。然后它检查main的依赖项。如果找到了依赖项(两个头文件),它就会运行命令。然后它回来完成下一个依赖项的任务,以此类推??

2-对于Point.o(即Point.h)的依赖性,为什么没有这样的命令

$(CXX) $(CXXFLAGS) -c Point.cpp

矩形也是如此。o为什么没有针对其依赖性的命令作为

$(CXX)$(CXXFLAGS)-c矩形.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.
....