深入學習Make命令和Makefile(上)(1)

2021-06-21 16:22:07 字數 1737 閱讀 3995



make是linux下的一款程式自動維護工具,配合makefile的使用,就能夠根據程式中模組的修改情況,自動判斷應該對那些模組重新編譯,從而保證軟體是由最新的模組構成。本文分為上下兩部分,我們將緊緊圍繞make在軟體開發中的應用展開詳細的介紹。

《深入學習make命令和makefile(下)

一、都是原始檔太多惹得禍

當我們在開發的程式中涉及眾多原始檔時,常常會引起一些問題。首先,如果程式只有兩三個原始檔,那麼修改**後直接重新編譯全部原始檔就行了,但是如果程式的原始檔較多,這種簡單的處理方式就有問題了。

設想一下,如果我們只修改了乙個原始檔,卻要重新編譯所有原始檔,那麼這顯然是在浪費時間。其次,要是只重新編譯那些受影響的檔案的話,我們又該如何確定這些檔案呢?比如我們使用了多個標頭檔案,那麼它們會被包含在各個原始檔中,修改了某些標頭檔案後,那些原始檔受影響,哪些與此無關呢?如果採取拉網式大檢查的話,可就費勁了。

由此可以看出,原始檔多了可真是件讓人頭疼的事。幸運的是,實用程式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所依賴的目標,這樣,當命令列中沒有給出目標時,也能確保它會被構建。

深入學習Make命令和Makefile(上) 3

五 makefile中的規則 除了指明目標和模組之間的依賴關係之外,makefile還要規定相應的規則來描述如何生成目標,或者說使用哪些命令來根據依賴模組產生目標。就上例而言,當make程式發現需要重新構建f1.o的時候,該使用哪些命令來完成呢?很遺憾,到目前為止,雖然make知道哪些檔案需要更新,...

深入學習Make命令和Makefile(下) 1

一 構建多個目標 有時候,我們想要在乙個makefile中生成多個單獨的目標檔案,或者將多個命令放在一起,比如,在下面的示例mymakefile3中我們將新增乙個clean 選項來清除不需要的目標檔案,然後用install選項將生成的應用程式移動到另乙個目錄中去。這個makefile跟前面的myma...

深入學習Make命令和Makefile(下) 3

三 字尾規則 前面我們已經看到,有些內部規則會根據檔案的字尾 相當於windows系統中的副檔名 來採取相應的處理。換句話說,這樣當make見到帶有一種字尾的檔案時,就知道使用哪些規則來建立乙個帶有另外一種字尾的檔案,最常見的是用以.c結尾的檔案來建立以.o結尾的檔案,即把原始檔編譯成目標程式,但是...