用g ++编写MakeFile。可忽略的命令

时间:2014-10-20 06:14:53

标签: c++ makefile g++

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

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

1 个答案:

答案 0 :(得分:3)

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

  2. makeimplicit rules用于构建.o目标。这些使用变量,例如$CXX$CXXFLAGS。对于给定目标,例如foo.omake将根据源文件foo.<ext>的存在应用规则,从而创建目标依赖关系对foo.o : foo.<ext>。如果扩展名是C ++版(例如.cpp.cc.C),那么它将应用

    的规则

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

  3. 您已为Point.o指定了额外依赖。这将添加到隐式依赖项Point.cpp中。如果Point.hPoint.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.
    ....