天天看點

Makefile條件編譯debug版和release版

一般,在開發測試階段用debug版本,而上線釋出用release版本。

使用Makefile定制編譯不同版本,避免修改程式和Makefile檔案,将會十分友善。

讀了一些資料,找到一個解決方法,Makefile預定義宏與條件判斷,結合make預定義變量,進行條件編譯。

比如,有一個test.cpp,包含這段代碼

#ifdef debug
//your code
#endif      

你希望在debug版本要執行它,在release版本不執行。

我們可以寫這樣的一個Makefile:

Makefile條件編譯debug版和release版
1 ver = debug
 2 
 3 ifeq ($(ver), debug)
 4 ALL: test_d
 5 CXXFLAGS = -c -g -Ddebug
 6 else
 7 ALL: test_r
 8 CXXFLAGS = -c -O3 
 9 endif
10 
11 test_d: test.do
12     g++ -o $@ $^
13 
14 test_r: test.ro
15     g++ -o $@ $^
16 
17 %.do: %.cpp
18     g++ $(CXXFLAGS) $< -o $@
19 
20 %.ro: %.cpp
21     g++ $(CXXFLAGS) $< -o $@      
Makefile條件編譯debug版和release版

簡單說一下,Makefile根據ver的不同定義了不同的編譯選項CXXFLAGS與輸出程式ALL,

debug版本輸出程式是test_d,release版本輸出程式是test_r

debug版本編譯選項是"-c -g -Ddebug",release版本編譯選項是"-c -O3"

debug版本object檔案字尾是".do",release版本object檔案字尾是".ro"

debug版本編譯選項使用"-D"定義宏debug,使得your code能夠執行。

不同版本的編譯選項、object檔案、輸出程式均不同,是以可以同時編譯兩個版本的程式,互不影響。

Makefile執行時,首先判斷ver變量,如果ver的值是debug,編譯debug版,否則編譯release版。當然,預設情況下是編譯debug版的。

如果想編譯release版,要怎麼做?

隻要在執行make時,對ver變量指派,使得ver的值不為debug,比如

# make ver=release      

如有疏漏,歡迎指正!

From http://www.cnblogs.com/caosiyang/