免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
多文件工程的編譯-Makefile的簡便寫法
通常我們在命令行使用GCC對程序進行編譯,如果對于單個或者幾個文件時比較方便的,但當工程中的文件逐漸增多甚至變得十分龐大的時候,使用GCC顯然力不從心,不好管理。因此我們有必要編寫一個Makefile來對工程進行管理。就以下工程目錄進行學習。

生成可執(zhí)行程序cacu,建立如下規(guī)則的Makefile文件。

#生成test,":"左邊為目標,右邊為依賴 。gcc后是命令cacu:add_int.o add_float.o sub_int.o sub_float.o main.o    gcc -o cacu add/add_int.o add/add_float.o \ (連接符)            sub_int.o sub_float.o main.o #生成add_int.o的規(guī)則add_int.o:add/add_int.c add/add_int.h    gcc -c -o add/add_int.o add/add_int.c #生成add_float.o的規(guī)則add_float.o:add/add_float.c add/add_float.h    gcc -c -o add/add_float.o add/add_float.c#生成sub_int.o的規(guī)則sub_int.o:sub/sub_int.c sub/sub_int.h    gcc -c -o sub/sub_int.o sub/sub_int.c#生成sub_float.o的規(guī)則sub_float.o:sub/sub_float.c sub/sub_float.h    gcc -c -o sub/sub_float.o sub/sub_float.c#生成main.o的規(guī)則main.o:main.c add/add.h sub/sub.h    gcc -c-o main.o main.c -Iadd -Isub#清理的規(guī)則clean:    rm -f test add_int.o add_float.o sub_int.o             sub_float.o main.o

Makefile的規(guī)則:
Makefile的框架是由規(guī)則構成的,make命令執(zhí)行時,先在Makefile文件中查找各種規(guī)則,對各種規(guī)則進行解析后,運行規(guī)則。規(guī)則的基本格式為
TARGET... :DEPENDEDS...
    COMAND
    ……
    ……
TARGET:規(guī)則所定義的目標。通常規(guī)則是最后生成的可執(zhí)行文件的文件名或者為了生成可執(zhí)行文件而依賴的目標文件的文件名,也可以是一個動作,稱之為。偽目標。
DEPENDEDS:執(zhí)行此規(guī)則所必須的依賴條件,例如生成可執(zhí)行文件的目標文件。DEPENDEDS也可以是某個TARGET,這樣就形成了TARGET之間的嵌套。
COMMAND:規(guī)則所執(zhí)行的命令,即規(guī)則的動作,例如編譯文件、生成庫文件、進入目錄等。動作可以是多個,每個命令占一行。規(guī)則的形式比較簡單,要寫好一個MakeEle需要注意一些地方,并對執(zhí)行的過程有所了解。

1.規(guī)則的書寫
在書寫規(guī)則的時候,為了使Make租e更加清晰,要用反斜杠(\)將較長的行分解為多行, 例如將"rm-fcacu add/add_int. o add/add_tloat. o sub/sub_int. o sub/sub_float. o main. o"分解為了兩行。命令行必須以Tab鍵開始,m工程序把出現(xiàn)在一條規(guī)則之后的所有連續(xù)的以Tab鍵開始的行都作為命令行處理。
注意:規(guī)則書寫時要注意COMMAND的位置,COMMAND前面的空白是一個Tab鍵,不是空格。Tab告訴make這是一個命令行,make執(zhí)行相應的動作。

2.目標
Makefile的目標可以是具體的文件,也可以是某個動作。例如目標cacu就是生成cacu的規(guī)則,有很多的依賴項,及相關的命令動作。而clean是清除當前生成文件的一個動作,不會生成任何目標項。

3.依賴項
依賴項是目標生成所必須滿足的條件,例如生成cacu需要依賴main.o,main.o必須存在才能執(zhí)行生成cacu的命令,即依賴項的動作在TARGET的命令之前執(zhí)行。依賴項之間的順序按照自左向右的順序檢查或者執(zhí)行。例如,下面的規(guī)則

main. o main. c add/add. h sub/sub. h
  gcc-c-o main. o main. c-ladd-Isub
main.c、add/add.h和sub/sub.h必須都存在才能執(zhí)行動作。gcc-c-omaiH.o main.c -ladd -lsub。。,當add/add.h不存在時,是不會執(zhí)行規(guī)則的命令動作的,而且也不會檢查sub/sub.h文件的存在,當然main.c由于在add/add.h依賴項之前,會先確認此項沒有問題。

4.規(guī)則的嵌套
規(guī)則之間是可以嵌套的,這通常通過依賴項實現(xiàn)。例如生成cacu的規(guī)則依賴于很多的.o文件,而每個.o文件又分別是一個規(guī)則。要執(zhí)行規(guī)則cacu必須先執(zhí)行它的依賴項,即
add_int.o、add_float.o、sub_int.o、sub_float.o、main.o,這5個依賴項生成或者存在之后才進行cacu的命令動作。

5.文件的時間戳
make命令執(zhí)行的時候會根據(jù)文件的時間戳判定是否執(zhí)行相關的命令,并且執(zhí)行依賴于此項的規(guī)則。例如對main.c文件進行修改后保存,文件的生成日期就發(fā)生了改變,再次調
用make命令編譯的時候,就會只編譯main.c,并且執(zhí)行規(guī)則cacu,重新鏈接程序。

6、執(zhí)行的規(guī)則
在調用make命令編譯的時候,m工程序會査找MakeEle文件中的第1個規(guī)則,分析并執(zhí)行相關的動作。例子中的第1個規(guī)則為cacu,所以m工程序執(zhí)行cacu規(guī)則。由于其依賴項包含5個,第1個為add_int.o,分析其依賴項,當add/add_int.c add.h存在的時候,執(zhí)行如下命令動作:

gcc-c-o addladd_int. o add/add_int. c

當命令執(zhí)行完畢的時候,會按照順序執(zhí)行第2個依賴項,生成add/add_flaot.o.當?shù)?個依賴項滿足時,即main.o生成的時候,會執(zhí)行cacu的命令,鏈接生成執(zhí)行文件cacu.當把規(guī)則clean放到第一個的時候,再執(zhí)行make命令不是生成cacu文件,而是清理文件。要生成cacu文件需要使用如下的make命令。

Debain #make cacu

7.模式匹配

在上面的Makefile中,main.o規(guī)則的書寫方式如下

main. o :main. c add/add. h sub/sub. h
    gcc-c-o main. o main. c-Iadd-Isub

有一種簡便的方法可以實現(xiàn)與上面相同的功能

main. o :%o %c
    gcc-c $<-o $@

這種方法的規(guī)則main.o中依賴項中的。%o:%c。的作用是將TARGET域的.o的擴展
名替換為.c,即將main.o替換為main.c.而命令行的S〈表示依賴項的結果,即main.c$@
表示TARGET域的名稱,即main.o。

在Makefile中使用用戶自定義變量

定義OBJS變量表示目標文件:

  OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

在調用OBJS的時候在前面加上$,并且變量的名稱可以用括號括起來。例如,使用gcc的默認規(guī)則進行編譯,cacu的規(guī)則可以采用如下形式

  cuca:gcc -o cacu $(OBJS)

用CC表示gcc,用CFLAGS表示編譯選項,RM表示rm -f ,TARGET表示最終的生成目標cacu。

CC = gcc          (CC定義成為gcc)
CFLAGS = -Isub -Iadd    (加入頭文件搜索路徑sub,add文件夾)
TARGET = cacu       (最終生成的目標)
RM = rm -f         (刪除的命令)

這樣,之前冗長的Makefile可以簡化為如下形式。

 

 1 CC = gcc 2 CFLAGS = -Isub -Iadd -O2  (O2為優(yōu)化) 3 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 4 TARGET = cacu 5 RM = rm -f 6 $(TARGET):$(OBJS) 7   $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 8 $(OBJS):%.o:%.c  (將OBJS中所有擴展名為.o的文件替換成擴展名為.c的文件) 9   $(CC) -c $(CFLAGS) $< -o $@  (生成目標文件)10 clean:11   -$(RM) $(TARGET) $(OBJS)  - 表示忽略錯誤

 由于CC的默認值已經為cc,RM的默認值為 rm -f,因此,如果在調用這些變量的時候未顯式給出變量的定義,編譯器就去調用其默認值。經過簡化,可以得到以下形式:

1 CFLAGS = -Isub -Iadd -O2  (O2為優(yōu)化)2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o3 TARGET = cacu4 $(TARGET):$(OBJS)5    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)6  $(OBJS):%.o:%.c  (將OBJS中所有擴展名為.o的文件替換成擴展名為.c的文件)7    $(CC) -c $(CFLAGS) $< -o $@  (生成目標文件)8  clean:9    -$(RM) $(TARGET) $(OBJS)  - 表示忽略錯誤

Makefile很智能(會自動推導,使用默認的方式生成目標文件),可以再簡化,就可以得到如下形式:

1 CFLAGS = -Isub -Iadd -O2  (O2為優(yōu)化)2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o3 TARGET = cacu4 $(TARGET):$(OBJS)5    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)6  clean:7   -$(RM) $(TARGET) $(OBJS)  - 表示忽略錯誤

Makefile之博大精深,暫時學習到這里(待續(xù))。。。。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
makefile .d的解釋
Linux makefile使用基礎
Makefile中PHONY的重要性
Makefile自動依賴
makefile 文件一步一步演變
用C實現(xiàn)WebService(ZZ)-蝸居
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服