2014-10-20 100 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