2014-10-20 63 views
0

我正在学习如何使用g ++编写Makefile。我使用以下example 的代码项目是here。这是在Makefileg ++中的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-我理解的语句是否正确。当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

你缺少'xxx.cpp'为'xxx.o' ... – PiotrNycz 2014-10-20 06:21:38

+0

@PiotrNycz我的GNU使(3.81)implicitl的版本依赖y增加了依赖性。 – juanchopanza 2014-10-20 06:33:32

回答

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

  2. make has implicit rules for building .o targets。这些使用变量如$CXX$CXXFLAGS。对于给定的目标,如foo.omake将应用规则,具体取决于源文件foo.<ext>的存在,从而创建目标依赖项对foo.o : foo.<ext>。如果扩展是一个C++的一个(例如.cpp.cc.C),那么它将应用规则沿着您指定额外的依赖Point.o的的

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

线。这被添加到隐含的依赖项Point.cpp。如果Point.hPoint.cpp的修改时间比Point.o更新,则将运行该规则。

正如@Basile在评论中指出的那样,您可以调用make-p--print-data-base选项来获取有关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 -p | grep -A 1 -B 1 Point 
.... 
Point.o: Point.cpp Point.h 
# Implicit rule search has been done. 
.... 
+0

运行'make -p'来理解隐式规则。 – 2014-10-20 06:51:46

+0

@BasileStarynkevitch很好的建议。我添加了一个例子。 – juanchopanza 2014-10-20 07:04:21

+0

感谢您的清除。最后一个问题是,“隐式规则将在不满足这些依赖关系时运行。默认情况下,对象Point.o的隐式规则仅取决于源文件,如Point.cpp。”。在这种情况下,Point.o的额外依赖是Point.h。隐式规则在这种情况下仍然会运行吗? – Rajeshwar 2014-10-20 15:14:36