makefile
中,可能需要書寫一些規則來描述乙個
.o目標檔案和標頭檔案的依賴關係。例如,如果在
main.c
中使用「
#include defs.h
」,那麼我們可能需要如下那樣的乙個規則來描述當頭檔案「
defs.h
」被修改以後執行
make
,目標「
main.o
」應該被重建。
main.o: defs.h
這樣,在乙個比較大型的工程中。就需要在
makefile
中書寫很多條類似於這樣的規則。並且,當在原始檔中加入或刪除標頭檔案後,也需要小心地去修改
makefile
。這是一件很費力、也很費時並且容易出錯誤的工作。為了避免這個令人討厭的問題,現代的
c編譯器提供了通過查詢原始檔中的「
#include
」來自動產生這種依賴的功能。「
gcc」支援乙個「
-m」的選項來實現此功能。「
gcc」將自動找尋原始檔中包含的標頭檔案,並生成乙個依賴關係。例如,如果「
main.c
」只包含了標頭檔案「
defs.h
」,那麼在
linxu
下執行下面的命令:
gcc -m main.c
其輸出是:
main.o : main.c defs.h
既然編譯器已經提供了自動產生依賴關係的功能,那麼我們就不需要去動手寫這些規則的依賴關係了。但是需要明確的是:在「
main.c
」中包含了其他的標準庫的標頭檔案,其輸出的依賴關係中也包含了標準庫的標頭檔案。當不需要依賴關係中不考慮標準庫標頭檔案時,需要使用「
-mm」引數。
需要注意的是,在使用「
gcc」自動產生依賴關係時,所產生的規則中明確的指明了目標是「
main.o
」檔案。一次在通過
.c檔案直接產生可執行檔案時,作為過程檔案的「
main.o
」的中間過程檔案在使用完之後將不會被刪除。
在舊版本的
make
中,使用編譯器此項功能通常的做法是:在
makefile
中書寫乙個偽目標「
depend
」的規則來定義自動產生依賴關係檔案的命令。輸入「
make depend
」將生成乙個稱為「
depend
」的檔案,其中包含了所有原始檔的依賴規則描述。
makefile
使用「include
」指示符包含這個檔案。
在新版本的
make
中,推薦的方式是為每乙個原始檔產生乙個描述其依賴關係的
makefile
檔案。對於乙個原始檔「
name.c
」,對應的這個
makefile
檔案為「
name.d
」。「name.d
」中描述了檔案「
name.o
」所要依賴的所有標頭檔案。採用這種方式,只有原始檔在修改之後才會重新使用命令生成新的依賴關係描述檔案「
name.o
」。 我們可以使用如下的模式規則來自動生成每乙個
.c檔案對應的
.d檔案:
%.d: %.c
$(cc) -m $(cppflags) $< > $@.$$$$; /
sed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.$$$$ > $@; /
rm -f $@.$$$$
此規則的含義是:所有的
.d檔案依賴於同名的
.c檔案。
第一行;使用
c編譯器自自動生成依賴檔案(
$<
)的標頭檔案的依賴關係,並輸出成為乙個臨時檔案,「
$$$$
」表示當前程序號。如果
$(cc)
為gnu的c
編譯工具,產生的依賴關係的規則中,依賴標頭檔案包括了所有的使用的系統標頭檔案和使用者定義的標頭檔案。如果需要生成的依賴描述檔案不包含系統標頭檔案,可使用「
-mm」代替「
-m」。
第二行;使用
sed處理第二行已產生的那個臨時檔案並生成此規則的目標檔案。這裡
sed完成了如下的轉換過程。例如對已乙個
.c原始檔。將編譯器產生的依賴關係:
main.o : main.c defs.h
轉成:main.o main.d : main.c defs.h
這樣就將
.d加入到了規則的目標中,其和對應的
.o檔案檔案一樣依賴於對應的
.c原始檔和原始檔所包含的標頭檔案。當
.c原始檔或者標頭檔案被改變之後規則將會被執行,相應的
.d檔案同樣會被更新。
第三行;刪除臨時檔案。
使用上例的規則就可以建立乙個描述目標檔案依賴關係的
.d檔案。我們可以在
makefile
中使用include
指示符將描述將這個檔案包含進來。在執行
make
時,makefile
所包含的所有
.d檔案就會被自動建立或者更新。
makefile
中對當前目錄下
.d檔案處理可以參考如下:
sources = foo.c bar.c
sinclude $(sources:.c=.d)
例子中,變數「
sources
」定義了當前目錄下的需要編譯的原始檔。變數引用變換「
$(sources : .c=.d)
」的功能是根據需要
.c檔案自動產生對應的
.d檔案,並在當前
makefile
檔案中包含這些
.d檔案。
.d檔案和其它的
makefile
檔案一樣,
make
在執行時讀取並試圖重建他們。其實這些
.d檔案也是一些可被
make
解析的makefile
檔案。 需要注意的是
include
指示符的書寫順序,因為在這些
.d檔案中已經存在規則。當乙個
makefile
使用指示符
include
這些.d
檔案時,應該注意它應該出現在終極目標之後,以免
.d檔案中的規則被是
makefile
的終極規則。關於這個前面我們已經有了比較詳細的討論。
收貨時自動產生PO
收貨自動產生po 在實際業務中,常常出現到貨物料沒有訂單或訂單未批准的現象,按照sap的標準流程,應該拒絕收貨。但 在實際業務中,這些物料可能是緊急採購的急件,如不及時處理,將會影響生產計畫的安排。對於這種特殊情況,其實sap有很靈活的處理方式,即由收貨自動創 建訂單。需要說明的是,這種操作方式並不...
利用巨集自動產生Get Set函式
c 中的巨集,是將乙個識別符號定義為乙個字串。在源程式中,該識別符號會被指定的字串來代替。格式 define 巨集名 參數列 巨集體 define sg m type,m public void set m const type in m type m private type m 1.巨集僅進行簡...
Makefile自動生成標頭檔案依賴
makefile自動生成標頭檔案依賴是很常用的功能,本文的目的是想盡量詳細說明其中的原理和過程。首先給出乙個本人在小專案中常用的makefile模板,支援自動生成標頭檔案依賴。cc gcc cflags wall o includeflags ldflags objs seq.o targets t...