乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      多文件工程的編譯-Makefile的簡便寫法

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

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

      復(fù)制代碼
      #生成test,":"左邊為目標(biāo),右邊為依賴 。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
      復(fù)制代碼

      Makefile的規(guī)則:
      Makefile的框架是由規(guī)則構(gòu)成的,make命令執(zhí)行時,先在Makefile文件中查找各種規(guī)則,對各種規(guī)則進行解析后,運行規(guī)則。規(guī)則的基本格式為
      TARGET... :DEPENDEDS...
          COMAND
          ……
          ……
      TARGET:規(guī)則所定義的目標(biāo)。通常規(guī)則是最后生成的可執(zhí)行文件的文件名或者為了生成可執(zhí)行文件而依賴的目標(biāo)文件的文件名,也可以是一個動作,稱之為。偽目標(biāo)。
      DEPENDEDS:執(zhí)行此規(guī)則所必須的依賴條件,例如生成可執(zhí)行文件的目標(biāo)文件。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í)行相應(yīng)的動作。

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

      3.依賴項
      依賴項是目標(biāo)生成所必須滿足的條件,例如生成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。。,當(dāng)add/add.h不存在時,是不會執(zhí)行規(guī)則的命令動作的,而且也不會檢查sub/sub.h文件的存在,當(dāng)然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í)行相關(guān)的命令,并且執(zhí)行依賴于此項的規(guī)則。例如對main.c文件進行修改后保存,文件的生成日期就發(fā)生了改變,再次調(diào)
      用make命令編譯的時候,就會只編譯main.c,并且執(zhí)行規(guī)則cacu,重新鏈接程序。

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

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

      當(dāng)命令執(zhí)行完畢的時候,會按照順序執(zhí)行第2個依賴項,生成add/add_flaot.o.當(dāng)?shù)?個依賴項滿足時,即main.o生成的時候,會執(zhí)行cacu的命令,鏈接生成執(zhí)行文件cacu.當(dāng)把規(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〈表示依賴項的結(jié)果,即main.c$@
      表示TARGET域的名稱,即main.o。

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

      定義OBJS變量表示目標(biāo)文件:

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

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

        cuca:gcc -o cacu $(OBJS)

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

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

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

       

      復(fù)制代碼
       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 $@  (生成目標(biāo)文件)
      10 clean:
      11   -$(RM) $(TARGET) $(OBJS)  - 表示忽略錯誤
      復(fù)制代碼

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

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

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

      復(fù)制代碼
      1 CFLAGS = -Isub -Iadd -O2  (O2為優(yōu)化)
      2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
      3 TARGET = cacu
      4 $(TARGET):$(OBJS)
      5    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
      6  clean:
      7   -$(RM) $(TARGET) $(OBJS)  - 表示忽略錯誤
      復(fù)制代碼

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

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多