2012-08-14 74 views
1

我的makefile文件包含以下行大廈的.o文件,利用makefile,澄清需要

11 SRC := $(shell echo src/*.cpp) 
12 SRC += $(shell echo $(TEST_ROOT)/*.cpp) 
13 
14 OBJECTS = $(SRC:.cpp=.o) 

22 # [debug] target 
23 $(TARGET): $(OBJECTS) 
24 $(CC) $(OBJECTS) -o $(TARGET) 
25 
26 # [debug] .o 
27 $(OBJECTS): $(SRC) 
28 $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $(SRC) $(OBJECTS) 

哪些失敗了,因爲...好以下顯然不是辦法做到這一點

g++ -pedantic -Wall -Werror -O0 -g -Wno-format -DUSE_MEASURE -c src/Timer.cpp test/TimerTest.cpp src/Timer.o test/TimerTest.o 

如何我是否應該修改第28行,以便從我的所有資源中生成.o?

回答

2

這應該做的伎倆:

$(OBJECTS): %.o : %.cpp 
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< [email protected] 

此規則將建立一個目標文件,並會每進行一次調用它的對象,其他規則需要。你可以編寫一個規則來構建所有的目標文件,但是沒有任何優勢。

編輯:

假設SRCsrc/foo.cpp src/bar.cpp testroot/baz.cpp
所以OBJECTSsrc/foo.o src/bar.o testroot/baz.o

我們可以爲每一個單獨的規則:

src/foo.o : src/foo.cpp 
    ... 

src/bar.o : src/bar.cpp 
    ... 

testroot/baz.o : testroot/baz.cpp 
    ... 

但這是多餘的(因爲命令非常相似)並且不方便(因爲我們沒有w螞蟻在添加/刪除目標時添加/刪除規則)。因此,我們使用一個pattern rule

%.o : %.cpp 
    ... 

現在當製作要建立src/foo.o,它看到的目標模式%.o,幹(對應於%)爲src/foo,以及相應的前提條件相匹配,src/foo.cpp存在,所以它使用這個規則。

但是我們有一個變量OBJECTS列出我們要建立這個規則的目標,所以我們可以把它限制在static pattern rule,看起來差不多,但有一定的優勢,我們不必進入這裏:

$(OBJECTS) : %.o : %.cpp 
    ... 

現在爲...部分。該命令告訴編譯器掃描prereq(src/foo.cpp)並構建目標(src/foo.o),因此我們必須在命令中引用這些內容。 Automatic variables有幫助; [email protected]是目標的名稱,$<是第一個(在這種情況下是唯一的)先決條件的名稱:

$(OBJECTS): %.o : %.cpp 
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< [email protected] 
+0

β - 謝謝你這麼多。一個非常好的和翔實的答案。如果我能我會++你兩次! – 2012-08-14 18:20:03

+0

使用您描述的場景,快速的問題,我如何構建代碼的調試和發佈版本?設置'$(D_OBJECTS):%.o:%.cpp'和$(R_OBJECTS):%.o:%.cpp'不起作用 – 2012-08-14 18:31:16

+0

@James:你有一些決定要先做出。你不能在同一個目錄下有兩個版本的'foo.o',所以你可以a)爲這些對象分別設置「debug /'和'release /'目錄(我最喜歡的方法),b) 'foo_debug.o'和'foo_release.o',或者c)一次只有一個版本的'foo.o'存在,並且有一些聰明能幫助記住它是哪一個。 – Beta 2012-08-15 00:44:32