深入學習Make命令和Makefile(上)(1)
一、都是原始檔太多惹得禍
當我們在開發的程式中涉及眾多原始檔時,常常會引起一些問題。首先,如果程式只有兩三個原始檔,那麼修改程式碼後直接重新編譯全部原始檔就行了,但是如果程式的原始檔較多,這種簡單的處理方式就有問題了。
設想一下,如果我們只修改了一個原始檔,卻要重新編譯所有原始檔,那麼這顯然是在浪費時間。其次,要是隻重新編譯那些受影響的檔案的話,我們又該如何確定這些檔案呢?比如我們使用了多個頭檔案,那麼它們會被包含在各個原始檔中,修改了某些標頭檔案後,那些原始檔受影響,哪些與此無關呢?如果採取拉網式大檢查的話,可就費勁了。
由此可以看出,原始檔多了可真是件讓人頭疼的事。幸運的是,實用程式make可以幫我們解決這兩個問題——當程式的原始檔改變後,它能保證所有受影響的檔案都將重新編譯,而不受影響的檔案則不予編譯,這真是太好了。
二、Make程式的命令列選項和引數
我們知道,make程式能夠根據程式中各模組的修改情況,自動判斷應對哪些模組重新編譯,保證軟體是由最新的模組構建的。至於檢查哪些模組,以及如何構建軟體由makefile檔案來決定。
雖然make可以在makefile中進行配置,除此之外我們還可以利用make程式的命令列選項對它進行即時配置。Make命令引數的典型序列如下所示:
make [-f makefile檔名][選項][巨集定義][目標]
make –e |
如果需要多個選項,可以只使用一個破折號,如
make –kr |
也可以每個選項使用一個破折號,如
make –k –r |
甚至混合使用也行,如
make –e –kr |
Make命令本身的命令列選項較多,這裡只介紹在開發程式時最為常用的三個,它們是:
–k:
如果使用該選項,即使make程式遇到錯誤也會繼續向下執行;如果沒有該選項,在遇到第一個錯誤時make程式馬上就會停止,那麼後面的錯誤情況就不得而知了。我們可以利用這個選項來查出所有有編譯問題的原始檔。
–n:
該選項使make程式進入非執行模式,也就是說將原來應該執行的命令輸出,而不是執行。
–f :
指定作為makefile的檔案的名稱。 如果不用該選項,那麼make程式首先在當前目錄查詢名為makefile的檔案,如果沒有找到,它就會轉而查詢名為Makefile的檔案。如果您在Linux下使用GNU Make的話,它會首先查詢GNUmakefile,之後再搜尋makefile和Makefile。按照慣例,許多Linux程式設計師使用Makefile,因為這樣能使Makefile出現在目錄中所有以小寫字母命名的檔案的前面。所以,最好不要使用GNUmakefile這一名稱,因為它只適用於make程式的GNU版本。
當我們想構建指定目標的時候,比如要生成某個可執行檔案,那麼就可以在make命令列中給出該目標的名稱;如果命令列中沒有給出目標的話,make命令會設法構建makefile中的第一個目標。我們可以利用這一特點,將all作為makefile中的第一個目標,然後將讓目標作為all所依賴的目標,這樣,當命令列中沒有給出目標時,也能確保它會被構建。