2009-08-21 21 views
0

我正在閱讀其他人的Makefile,如下所示。是優化和生成編譯或鏈接的調試信息部分

LDFLAGS=-lm -ljpeg -lpng 

ifeq ($(DEBUG),yes) 
     OPTIMIZE_FLAG = -ggdb3 -DDEBUG -fno-omit-frame-pointer 
else 
     OPTIMIZE_FLAG = -ggdb3 -O3 
endif 

CXXFLAGS = -Wall $(OPTIMIZE_FLAG) 

all: test 

test: test.o source1.o source2.o 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) 

Makefile.depend: *.h *.cc Makefile 
     $(CC) -M *.cc > Makefile.depend 

clean: 
     \rm -f test *.o Makefile.depend 

-include Makefile.depend 

這裏是我的問題:

  1. 雖然沒有明確,使用$(CXXFLAGS)編譯過程中在這個Makefile中未示出的隱含規則生成對象文件

  2. 我也想知道爲什麼$(CXXFLAGS)出現在聯動階段?我認爲這只是編輯階段?我可以從「$(CXX)$(CXXFLAGS)-o $ @ $^$(LDFLAGS)」中刪除$(CXXFLAGS)嗎?如果我錯了,是否意味着g ++也會生成調試信息並在鏈接上進行優化?

  3. 爲什麼要將-ggdb3 -O3一起用於非調試目的?它的目的是什麼?如果僅僅考慮提高速度,那麼是不是隻使用-O3更好?

  4. 出於調試目的,如何一起使用-ggdb3 -fno-omit-frame-pointer將比單獨使用-ggdb3更好?我試圖通過閱讀gcc文件來理解-fno-omit-frame-pointer的目的,但仍然感到困惑。

  5. 我可以在「$(CC)-M * .cc> Makefile.depend」和「clean」之上移動「-include Makefile.depend」嗎?它在Makefile中的位置是否重要?

回答

2

CXXFLAGS由隱式規則使用。請使-n -p查看由內部規則集和make文件生成的變量和規則的完整列表。

-g調試選項僅用於編譯階段。 -O選項可用於編譯和鏈接階段。你可以一起使用兩者。從我的gcc手冊頁:

GCC允許您將-g與-O一起使用。 優化代碼 採用的快捷方式可能偶爾會產生令人驚訝的結果 結果: 您聲明的某些變量可能根本不存在;控制流程 可能會暫時移動,但您沒有注意到 ;某些 語句可能無法執行,因爲它們計算常量 結果或其值已經爲 ;一些狀態 可能會在不同的地方執行,因爲它們被移出循環外的 。

不過,它證明可以調試優化的輸出。 這使得對可能有錯誤的程序使用 優化程序是合理的。

-fno-omit-frame-pointer實際上減少了優化。優化可能會干擾調試,編寫該makefile的人員明確打算在優化後的代碼上運行調試器。如果你不清楚gcc手冊是如何工作的,你可能想在週六的時候坐下Intel或AMD體系結構參考手冊,並在指令級別學習函數調用和參數傳遞。 (然後,也許不是。:))

在Makefiles中的位置問題。我會在最後包含文件。否則,會破壞包含文件相關性檢查的風險。

+0

謝謝! 您的意思是說它是「-ggdb3 -O3」,用於在優化的代碼上運行調試器? 對於非調試目的,「-ggdb3 -DDEBUG -fno-omit-frame-pointer」不涉及優化,那麼爲什麼「-fno-omit-frame-pointer實際上減少了優化」,如果沒有優化代碼? – Tim 2009-08-22 01:15:58

+0

我無法確定。不能保證這個makefile是完全一致的。也許這組標誌是從另一個變化中剩下的,或者寫這個標誌的人沒有完全理解它們的含義。 – 2009-08-22 20:18:08