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

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

    • 分享

      makefile使用

       zm8208 2010-01-27

      1     makefile 實(shí)際上是一個(gè)單行shell腳本,用make來(lái)調(diào)用。

      2     makefile 使用的命令解釋器由SHELL這個(gè)變量所控制,make 啟動(dòng)時(shí)會(huì)從用戶環(huán)

      保導(dǎo)入所有的變量經(jīng)作為make有變量,但不包括SHELL變量。

      3     每個(gè)命令必須以跳格符(tab)開(kāi)頭在工作目標(biāo)之后,凡是第一個(gè)字符為跳格的文本行一律被視為命令。@放在要執(zhí)行的命令前,執(zhí)行時(shí)不打印這個(gè)命令。

      4     $ 符號(hào)跟開(kāi)括號(hào),函數(shù)名,空格后跟一列由逗號(hào)分隔的參數(shù),最后用關(guān)括號(hào)結(jié)

      束。例如  SOURCES = $(wildcard *.c) 這行會(huì)產(chǎn)生一個(gè)所有以 '.c' 結(jié)尾的文

      件的列表,然后存入變量 SOURCES 里。

      5     常用函數(shù)。

      A wildcard, 它有一個(gè)參數(shù),功能是展開(kāi)成一列所有符合由其參數(shù)描述的文

      件名,文件間以空格間隔。 $(wildcard *.c)產(chǎn)生一個(gè)所有以 '.c' 結(jié)尾的文件

      的列表.

      B, patsubst, 它需要3個(gè)參數(shù)——第一個(gè)是一個(gè)需要匹配的式樣,第二個(gè)表示用什

      么來(lái)替換它,第三個(gè)是一個(gè)需要被處理的由空格分隔的字列. OBJS = $(patsubst

      %.c,%.o,$(SOURCES)) 處理所有在 SOURCES 字列中的字(一列文件名),如果它

      結(jié)尾是 '.c' ,就用 '.o' '.c'取代.

      Cnotdir 去除路徑。

      6     規(guī)則分為三部分,A 工作目標(biāo), B 它的必要條件。 C 所要執(zhí)行的命令。

      工作目標(biāo)是一個(gè)必須建造的文件或進(jìn)行的事情,必要條件或依存對(duì)像是工作目標(biāo)得以被成功創(chuàng)建之前,必須事先存在的那些文件,而所要執(zhí)行的命令是必要條件成立時(shí)將會(huì)創(chuàng)建工作目標(biāo)的那些shell命令。

      7         -l<NAME>,形式的必要條件出現(xiàn)時(shí),make 會(huì)搜索libNAME.so文件,如果沒(méi)有會(huì)再找libNAME.a文件,找到后就進(jìn)行最后的動(dòng)作----鏈接。

      8    make 被調(diào)用時(shí)會(huì)自動(dòng)編譯其所找到的第一個(gè)工作目標(biāo),要想更改工作目標(biāo),請(qǐng)?jiān)诿钚猩现付üぷ髂繕?biāo)的名稱。

      9     可以用反斜線平延續(xù)過(guò)長(zhǎng)的文本行。

      10    具體規(guī)則

      A     工作目標(biāo)與必要條件是一種依存關(guān)系,不是說(shuō)必要條件一定用在編譯工作目標(biāo)的文件夾中。如:a.o 只是編譯a.c時(shí)生成,但b.c有改動(dòng)時(shí)要重新編a.o

      a.o: a.c

      a.o: b.c /*當(dāng)b.c變化時(shí)要重編a.o*/

            B     通配符。

      模式出現(xiàn)在工作目標(biāo)或必要條件時(shí),是由make進(jìn)行能配符的的擴(kuò)展,不模式出現(xiàn)在命令中時(shí),是由subshell進(jìn)行擴(kuò)展的動(dòng)作。

      C     假想工作目標(biāo)。(1)總是標(biāo)記為未更新,并且認(rèn)make知道不應(yīng)該像處理一般規(guī)則一樣,從源文件平建立工作目標(biāo)為名的文件。(2)可以經(jīng)假想目標(biāo)作為另一個(gè)工作目標(biāo)的必要條件,可以讓make在進(jìn)行實(shí)際的工作目標(biāo)之前調(diào)用假想工作目標(biāo)。在假想工作目標(biāo)加上打印,可以輸出相應(yīng)的打印信息。(3)標(biāo)準(zhǔn)的假想目標(biāo)有以下:all,install, chean, distclean, TAGS, info, check..

             D     空工作目標(biāo)。(參見(jiàn)《GNU MAKE項(xiàng)目管理》25頁(yè))

             E     變量。用$(variable-name)來(lái)擴(kuò)展變量。變量名是一單字符時(shí)不用圓括號(hào)。自動(dòng)變量有以下幾個(gè):

      1$@ ,工作目標(biāo)的文件名。

      2$< 第一個(gè)必要條件。

      3$? 時(shí)間戳在工作目標(biāo)之后的所有必要條件,以空格隔開(kāi)。

      4$^ 所有必要條件,以空格隔開(kāi),文件名不重復(fù)。

      5$+ 如同$^,但包括重名的文件。

      6$* 工作目標(biāo)主文件名。不能在模式規(guī)則以外使用這個(gè)變量。

                   

      F 模式規(guī)則, 所有內(nèi)置規(guī)則都是模式規(guī)則的實(shí)例。模式規(guī)則中%等同于unix中的shell.可以通過(guò)make –print-data-base查看當(dāng)前的makefile有哪些默認(rèn)規(guī)則和變量。

             1).%.o:%.c

                           $(CC) –c –o $@ $<

                    這個(gè)內(nèi)置規(guī)則是把.c編譯成.o

      2 %: %.o

      $(CC ) –o $@ $<

             G 靜態(tài)模式規(guī)則,可以認(rèn)為是限定模式規(guī)則的應(yīng)用中在特定的文件上。

                    $(OBJ):%.o:%.c

                           $(CC) –c –o $@ $<

      %.o模式會(huì)匹配$(OBJ)中所列出的每個(gè)文件,并取出其主干部分,分別構(gòu)成各個(gè).o文件,這樣就產(chǎn)生了工作目標(biāo)和必要條件。

      H 隱含規(guī)則

      A 隱含規(guī)則不是模式規(guī)則就是后綴規(guī)則。當(dāng)目標(biāo)加入makefile只要不寫(xiě)要執(zhí)得的腳本就可以使勝隱含規(guī)則了。

      B 一個(gè)沒(méi)有指定腳本的模式規(guī)則將會(huì)從make的規(guī)則庫(kù)中刪除相應(yīng)的規(guī)則。

       

      12 文件查找。

             VPATHvpath來(lái)查找文件。

      A .VPATH變量的內(nèi)容是一份目錄列表,可供make搜索其所用的文件,注意這個(gè)目錄列表只是用來(lái)搜索工作目標(biāo)以及必要條件,但不包括命令腳本中所提到的文件。

      B. 如果多個(gè)目錄中出現(xiàn)同名的文件,make只會(huì)取第三者個(gè)被找到的文件。

      C. 可以用vpath指令在特定目錄搜索特定文件。

          vpath pattern directory-list

          vpath  %.c src   src目錄下搜索.c 文件。

      D.個(gè)人覺(jué)得小項(xiàng)目中可用這個(gè)功能,大項(xiàng)目中盡量不用,否則會(huì)導(dǎo)制難以發(fā)現(xiàn)的問(wèn)題。

       

      13 自動(dòng)產(chǎn)生依存關(guān)系。(還要完善)

      1)一個(gè)C文件可能include多個(gè)頭文件,手動(dòng)去分析這些關(guān)系不太可能,所以要自動(dòng)去分析。

      gcc –M test.c這個(gè)命令可以打印出test.c 依賴什么頭文件。

      這樣就可以編寫(xiě)一個(gè)腳本加入這些自動(dòng)產(chǎn)生的腳本。但這樣不最好的選擇。

      2)第二種方法是為make加入一個(gè)include指令。

      編寫(xiě)一個(gè)makefile工作目標(biāo),此工作目標(biāo)的動(dòng)作就是以-M選項(xiàng)對(duì)所有源文件執(zhí)行gcc,并將結(jié)果存入一個(gè)依存文件中,然后重新執(zhí)行make以便把剛才所產(chǎn)生的依存文件引入makefile,這樣就可以觸發(fā)所要的更新動(dòng)作。

      例:

      depend: file_a.c file_b.c file_c.c

             $(CC) –M $(CPPFLAGS) $^ > $@

      include depend

      但還有問(wèn)題,就是對(duì)源文件加入或移除依存關(guān)系時(shí)通常不會(huì)產(chǎn)生depend文件,這會(huì)造成無(wú)法重新編譯源文件,整個(gè)工作又會(huì)變得一團(tuán)亂。

       

      3GNU make中可以使用一個(gè)或能和一個(gè)簡(jiǎn)單的算法來(lái)解決上面的問(wèn)題。

      算法:如果我們?yōu)槊總€(gè)源文件產(chǎn)生依存關(guān)系,將之存入相應(yīng)的依存文件(擴(kuò)展名為.d的文件)并以該.d文件為工作目標(biāo)來(lái)加入此依存規(guī)則,這樣,當(dāng)源文件被改變時(shí),make就會(huì)知道要更新該.d文件以及目標(biāo)文件。

      如:test.o test.d: test.c test.h filea.h

      程序中可以使用如下模式規(guī)則用命令腳本。

      %d: %c

             $(CC) –M $(CPPFLAGS) $< > $@.$$$$;    \

             sed ‘s,\($*\)\.o[ :]*,\1.o $@ : , g’ < $@$$$$ > $@; \

             rm –f $@.$$$$

            

      14 管理程序庫(kù)

      程序庫(kù)可簡(jiǎn)單的認(rèn)為把相關(guān)的目標(biāo)文件聚集在一起。

      1), ar rv libtest.a test1.o test2.o test3.o

      r選頂表示要以指定的目標(biāo)文件替換程序庫(kù)里的成員。

      v 選項(xiàng)表示ar要詳細(xì)打印出它所做的動(dòng)作。

      2),兩種方法引用程序庫(kù)。

             A,在命令行上直接指定這個(gè)程序庫(kù)全名。

             gcc litest.a test3.o –o test.elf

             B,使用-l選項(xiàng)。

             gcc -ltest  test3.o –o test.elf

      盡量使用每二種,因?yàn)?/span>-l選項(xiàng)告訴gcc去搜索相應(yīng)的目錄。-L選項(xiàng)可以指定搜索路徑,用于所有和程序庫(kù)的搜索上.

      3,程序庫(kù)會(huì)為它所包含的符號(hào)提供索引,較新的ar程序會(huì)在新成員加入時(shí)自動(dòng)管理此索引,舊的ar不會(huì)這樣做,所以對(duì)于舊的ar要用另外一個(gè)程序來(lái)修建或更新索引.

      ranlib libtest.a

      4,程序庫(kù)有可能有相互依賴關(guān)系,:A中用到B, B里又用到A,A要放在B前面,這樣在用這些程序庫(kù)時(shí)應(yīng)這樣.

       –lA –lB –lA

       

      15 變量與宏.

      1, 要取一個(gè)變量的值應(yīng)這樣$(var),${var}注意在shell中不能用括號(hào).

      2, 給變量賦值時(shí)注意,賦值號(hào)右邊字特串前導(dǎo)空格會(huì)被刪除但字符串后面的空格會(huì)被保留,這有時(shí)會(huì)導(dǎo)致問(wèn)題,所以不要在后面加空格。變量主要有三種:常量,內(nèi)部變量,函數(shù)。

      3 簡(jiǎn)單擴(kuò)展變量:在makemakefile讀進(jìn)該變量的定放語(yǔ)句,賦值運(yùn)算符右邊的部分會(huì)立刻擴(kuò)展。

      CC =gcc

      MAKE_DEPEND := $(CC) –M  注意如果CC沒(méi)有定義那么會(huì)被擴(kuò)展成  <space>-M

      MKDIR =mkdir –p

      4 遞歸擴(kuò)展變量:擴(kuò)展動(dòng)作會(huì)被延遲到該變量被使用時(shí)才進(jìn)行擴(kuò)展,有可能出現(xiàn)令人意外的結(jié)果。

      source = *.c

      objects = $(subst .c, .o, $(source))

      5 條件賦值:在變量值尚不存在的情況下進(jìn)行變量的賦值的動(dòng)作。

      CC ?= gcc

      6 附加運(yùn)算符:將文本附加到變量里。

      VAR += test.c

      7 封裝命令序列,也可以稱為宏

      define create-jar

      ….

      endef

      8 函數(shù)變量

      maybe-make-dir = $(if $(wildcard $1), , $(MKDIR) $1)

       

      9)何時(shí)擴(kuò)展變量

      make運(yùn)行時(shí)分兩個(gè)階段:A 讀進(jìn)makefile以及被引入的其它makefile和規(guī)則文件,其中所定義的變量和規(guī)則會(huì)被加載進(jìn)make的內(nèi)部數(shù)據(jù)庫(kù),而且依存圖也建立起來(lái)。B make分析依存圖并且判斷要更新的工作目標(biāo),然后完成相應(yīng)的動(dòng)作。

       

      16 變量來(lái)自何處

      1 文件中,定義在makefile或是被makefile引入的文件。

      2 命令行??梢栽诿钚猩隙x或重新定義變量。命令行上的變量值將會(huì)覆蓋掉環(huán)境變量以及makefile文件中的賦值結(jié)果。

      3 環(huán)境。

      4 自動(dòng)創(chuàng)建。make會(huì)在執(zhí)行一個(gè)規(guī)則的命令腳本前立刻創(chuàng)建自動(dòng)變量。

       

      17 條件指令與引入指令

      1 條件指令用來(lái)控制makefile文件中使用哪些部分,省略哪些部分。

      if-condition

      …….

      endif

      if-condition

      …….

      else

      …….

      endif

      ifcondition可以是以下之一,

      ifdef variable-name

      ifndef variable-name

      ifeq test

      ifneq test

      進(jìn)行條件測(cè)試時(shí)不應(yīng)該以$()括住variable-name,可以如下表示。

      ifeq‘var1  var2’?ifeq“var1”  var2’?ifeq‘  var2’“var1”

      2 注意條件指令前不能以一個(gè)跳格符開(kāi)始,如果以跳格符開(kāi)始的話

             3include指令

      makefile可以用include指令引入其它文件,這個(gè)功能通常會(huì)用來(lái)引入make頭文件中所存放的共同的make定義,或是用來(lái)自動(dòng)產(chǎn)生依存關(guān)系信息。

       

      18 命令

      1)每個(gè)命令會(huì)在它自己的shell中執(zhí)行,所以要讓一系列shell命令一起執(zhí)行,要特別處理。簡(jiǎn)單的說(shuō)就是把命令放在一行進(jìn)行處理。

      .INTERMEDIATE:file_list

      file_list:

             for d in logic ui;     \

             do    \

                    echo $$d/*.java:     \

             done > $@

       

      19 命令修飾符

             1@ 不要輸出命令

             可以這樣用

             QUIET=@

             script:

                    $(QUIET) cmd 

             這樣只用控制QUIET變量就可以控制命令輸出了。

       

             2- 破折號(hào)前綴,忽略命令中的錯(cuò)誤。

             3+加號(hào)修飾符, 要求make執(zhí)行命令就算用戶以—just-print命令來(lái)執(zhí)行。

      20 錯(cuò)誤與中斷

             1make 每執(zhí)行一個(gè)命令就會(huì)返回一個(gè)狀態(tài)碼,零表示成功,非零表示出錯(cuò)。常見(jiàn)的有如下:

             A shellif 結(jié)構(gòu)沒(méi)有使用else當(dāng)走else分支時(shí)會(huì)返回錯(cuò)誤。

             B rm , mkdir等命令。rm –f , mkdir –P

             2)如查用戶要求腳本中的兩條語(yǔ)句在同一個(gè)subshell中執(zhí)行,那長(zhǎng)必須用語(yǔ)句連接符來(lái)隔開(kāi)它們(;&&.

      21 大型項(xiàng)目管理

             現(xiàn)有兩種方法:遞歸式和單一makefile從每個(gè)組件目錄引入信息。

             1)遞歸makefile

      A 要使用make來(lái)編譯一個(gè)大型項(xiàng)目時(shí),可以為每一個(gè)目錄編寫(xiě)一個(gè)簡(jiǎn)單的,各自獨(dú)立的makefile,然后分別地執(zhí)行它們。有以下兩種進(jìn)入下層的目錄。

      make –directory=subdir

      make –C subdir

             B 假設(shè)一個(gè)項(xiàng)目有三個(gè)庫(kù),UI, DECODE, DATABASE 一個(gè)可執(zhí)行程序PLAYER,它們分別放在不同的目錄里。

      可以這樣寫(xiě)makefile

      UI_DIR

      DECODE_DIR

      DATABASE_DIR

      PLAYER_DIR

       

      SUB_DIR=$(UI_DIR) $(DECODE_DIR) $(DATABASE_DIR) $(PLAYER_DIR)

      for dir in $(SUB_DIR)

      do

             make –C $$dir

      done

       

       

       

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多