2010-06-21 15 views
9

可以說我有文件:如何在Makefile中定義的規則來編譯只就修改過的* .cpp文件(和它們的依賴),並不是所有的* .cpp文件

利布斯:

  • one.cpp,one.h
  • two.cpp,two.h
  • three.cpp,three.h

計劃:

  • program.cpp

有沒有辦法,創建Makefile文件將只編譯*這是從上次編譯修改的.cpp?

目前我有類似的東西:

SRCS = one.cpp two.cpp three.cpp 
OBJS = $(SRCS:.cpp=.o) 

all: $(OBJS) program 

.cpp.o: 
    g++ -Wall -c $< 

program: 
    g++ -Wall $(OBJS) program.cpp -o program 

clean: 
    rm -f $(OBJS) program 

我工作得很好,但是當我編譯我的程序,然後更改two.cpp或two.h我需要運行「使清潔」第一,因爲當我其次運行「make」我得到:

Nothing to be done for 'all'. 

我想改變我的Makefile以這種方式,它會承認我的改變和重新編譯文件和它的依賴(如果one.cpp從two.cpp使用代碼這是修改過的,兩個文件都應該重新編譯)。

所以,如果我修改two.cpp,使應該做的:

g++ -Wall -c two.cpp 
g++ -Wall $(OBJS) program.cpp -o program 

但如果one.cpp使用從two.cpp代碼進行了修改,使shold做:

g++ -Wall -c one.cpp 
g++ -Wall -c two.cpp 
g++ -Wall $(OBJS) program.cpp -o program 
+0

(我想你的意思是'one.cpp',而不是'first.cpp'。) – Beta 2010-06-21 19:10:04

+0

是的,它應該是one.cpp。 – user360872 2010-06-21 19:24:45

回答

12

首先我們做的目標文件先決條件可執行文件。一旦做到這一點,請將重建program的索馬里紅新月會隨時變化,因此我們不需要OBJS作爲一個明確的目標:

all: program 

program: $(OBJS) 
    g++ -Wall $(OBJS) program.cpp -o program 

然後我們做的對象的頭文件的先決條件,因此,如果我們改變three.h,請將重建three.o:

$(OBJS): %.o : %.h 

最後因爲one.cpp由two.h(我希望)的方式使用代碼來自two.cpp,我們做一個two.ha先決條件。○:

one.o: two.h 

使事情更清潔,更容易維護,我們使用的自動變量:

program: $(OBJS) 
    g++ -Wall $^ program.cpp -o [email protected] 

把它放在一起,我們得到:

SRCS = one.cpp two.cpp three.cpp 
OBJS = $(SRCS:.cpp=.o) 

all: program 

$(OBJS): %.o : %.h 

one.o: two.h 

.cpp.o: 
    g++ -Wall -c $< 

program: $(OBJS) 
    g++ -Wall $^ program.cpp -o [email protected] 

clean: 
    rm -f $(OBJS) program 

有一個我們可以做更多的事情(比如將012.添加到OBJS),但這對今天已經足夠了。

1

添加命令依賴運行到目標名稱右側的文件。

例子:

default: hello.c 
    gcc -o hello.bin hello.c 

install: hello.bin 
    cp hello.bin ../ 
+0

這不就是'$(OBJS)'的用途嗎? – JAB 2010-06-21 18:52:44

+0

你告訴我,這是你的代碼。我從來沒有在依賴字段中使用變量,但沒有任何邏輯上阻止它工作。 – mcandre 2010-06-21 19:23:33

+0

但它不是我的代碼。 – JAB 2010-06-21 20:24:54

0

所有你需要做的就是告訴make的.o文件將取決於.cpp文件:

%.cpp.o: %.cpp 
    g++ -Wall -c -o [email protected] $< 
+0

這不會解決頭文件或對象文件依賴性的問題。 – Beta 2010-06-21 19:12:44

相關問題