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

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

    • 分享

      關(guān)于makefile中自動(dòng)產(chǎn)生依賴的理解

       戴維圖書館 2016-09-28

      本博文是在學(xué)習(xí)了《GNU Make中文手冊(cè)》后記錄下來(lái)的自己的關(guān)于自動(dòng)產(chǎn)生makefile依賴的語(yǔ)句的理解,向大家分享。

      《GNU make中文手冊(cè)》中的相關(guān)章節(jié)見(jiàn)一下鏈接:

      http://blog.csdn.net/gmpy_tiger/article/details/51849257

      ========================================================================================

      為了理解自動(dòng)產(chǎn)生依賴的代碼,必須先掌握這兩個(gè)基礎(chǔ)又有點(diǎn)偏的知識(shí)點(diǎn):

      1、Makefile 中,一個(gè)文件可以作為多個(gè)規(guī)則的目標(biāo)(多個(gè)規(guī)則中只能有一個(gè)規(guī)則定義命令)。這種情況時(shí),以這個(gè)文件為目標(biāo)的規(guī)則的所有依賴文件將會(huì)被合并成此目標(biāo)一個(gè)依賴文件列表,當(dāng)其中任何一個(gè)依賴文件比目標(biāo)更新(比較目標(biāo)文件和依賴文件的時(shí)間戳)時(shí),make 將會(huì)執(zhí)行特定的命令來(lái)重建這個(gè)目標(biāo)。

      舉個(gè)例子:

      有如下的makefile:

                     foo.o : defs.h
                     bar.o : defs.h test.h
                     foo.o : config.h

      等效于:

                     foo.o : defs.h config.h

                     bar.o : defs.h test.h

      就是把相同foo.o目標(biāo)的規(guī)則(最多只允許一個(gè)規(guī)則有命令,其他規(guī)則只能有依賴)合并所有的依賴。

      2、在linux 的命令sed中,有這么一個(gè)規(guī)則(模式替換單獨(dú)的單詞,見(jiàn)《Linux命令行與shell腳本編程大全》):

             sed編輯器用圓括號(hào)來(lái)定義替代模式的子字符串,替代字符由反斜杠和數(shù)組組成。

             很難理解是吧,舉個(gè)例子你就懂了。

             echo "maybe this is a test" | sed 's/\ (this\ ) is a \ (test\ )/Is \1 really \2 /g'

      輸出:

             maybe Is this really test

             關(guān)于腳本的echo,管道,sed的替換命令s等基礎(chǔ)我就不講了,自己百度學(xué)習(xí)。這里我要講的是,用“()”小括號(hào)括起來(lái)的被替換內(nèi)容,可以在替換內(nèi)容上用“\數(shù)字”代替,直接動(dòng)態(tài)引用,省去重復(fù)輸入的麻煩。例如上面的例子,\1代表this,\2代表test,整個(gè)sed命令的意思是把

             this is a test

      替換為

             Is this really test

      ps:因?yàn)樾±ㄌ?hào)在正則表達(dá)式中有意義,因此需要轉(zhuǎn)義,因此是\ (...\ )而不是(...)

      ========================================================================================

      廢話不多說(shuō),先直接上我自己寫得自動(dòng)產(chǎn)生依賴的代碼(與《GNU Make中文手冊(cè)》有些許出入,會(huì)寫linux腳本的就會(huì)發(fā)現(xiàn),修改的部分無(wú)傷大雅):

                    %.d : %.c

                               gcc -MM  $< > $@.$ $ $ $; \                                    (1)
                               sed 's/\ ($*\ )\.o/\1.o $@/g' < $@.$ $ $ $ > $@; \       (2)

                               rm -f $@.$ $ $ $                                                       (3)

      ps:網(wǎng)頁(yè)的排版問(wèn)題,為了看的直觀做了修改,使用時(shí)請(qǐng)把四個(gè)$以及\ (和\ )之間的空格去掉,下同

      繼續(xù)以例子講解:

      源代碼如下(helloworld.c):

                #include <stdio.h>
                #include "test.h" //test.h為空文件,只用于實(shí)驗(yàn)講解
                int main(int argc, char *argv){
                        printf("hello world!\n");
                }

      (1):

      用gcc -MM helloworld.c的輸出結(jié)果是:

               helloworld.o: helloworld.c test.h

      因此(1)行代碼

                  gcc -MM  $< > $@.$ $ $ $; \                                    (1)

      的作用,就是生成helloworld.o.xxxx的臨時(shí)文件,文件內(nèi)寫得是"helloworld.o: helloworld.c test.h"

      ps:在第一行的代碼里涉及到makefile的自動(dòng)化變量$<、$@和linux腳本的重定向,自行百度,不再講解。

      (2):

      第二行的代碼

                  sed 's/\ ($*\ )\.o/\1.o $@/g' < $@.$ $ $ $ > $@; \       (2)

      參考本博文上文的基礎(chǔ)知識(shí)2,其中,$*是自動(dòng)化變量,在這里指的是:helloworld。$@也是自動(dòng)化變量,在這里指的是helloworld.d。

      這行代碼可以理解為:

                  sed 's/helloworld.o/helloworld.o helloworld.d/g' < $@.$ $ $ $ >$@

                  ps:其中的兩個(gè)< 、>為linux腳本的重定向,自己百度學(xué)習(xí)。

      因此,實(shí)際的處理結(jié)果是把第(1)行代碼的結(jié)果

                  helloworld.o: helloworld.c test.h

      轉(zhuǎn)換為:

                  helloworld.o helloworld.d: helloworld.c test.h

      并把轉(zhuǎn)換的結(jié)果保存到helloworld.d文件中。

      (3):

      第二行代碼其實(shí)就已經(jīng)完成任務(wù)了,第三行代碼僅僅是刪除第一行代碼創(chuàng)建的臨時(shí)文件$@.$$$$。在此不再詳述。

      =======================================================================================

      自動(dòng)產(chǎn)生依賴的代碼就這樣理解,那怎么使用呢?

      先看看上面代碼生成的結(jié)果:

                   helloworld.o helloworld.d: helloworld.c test.h      保存在helloworld.d文件中

      要使用,除了上面的代碼之外,只需要加一句

                  include helloworld.d

      其實(shí)就相當(dāng)于把代碼自動(dòng)生成的 helloworld.o helloworld.d: helloworld.c test.h包含在makefile中。

      包含上了helloworld.d的作用有兩條

      1、因?yàn)橐琱elloworld.d,當(dāng)搜索不到有helloworld.d文件時(shí),就會(huì)自動(dòng)匹配上文產(chǎn)生依賴的代碼,自行生成helloworld.d,當(dāng)然,當(dāng)helloworld.c或者test.h修改后,由于helloworld.d已經(jīng)過(guò)時(shí),也會(huì)重新生成helloworld.d

      2、helloworld.o的依賴會(huì)合并上helloworld.c test.h(參考本博文上文的基礎(chǔ)知識(shí)1),從而實(shí)現(xiàn)了自動(dòng)產(chǎn)生依賴

      =======================================================================================

      總結(jié)起來(lái),我對(duì)上面helloworld源碼寫的makefile如下:

                   CC = gcc 
                   TARGET = helloworld

                   $(TARGET) : 

                   include $(TARGET).d

                   %.d : %.c 
                       gcc -MM $^ > $@.$ $ $ $; \
                       sed 's/\ ($*.o\ )/\1 $@/g' < $@.$ $ $ $ > $@; \
                       rm  $@.$ $ $ $

                   .PHONY: clean

                   clean:
                       $(RM) $(TARGET) $(TARGET).d $(TARGET).o

      helloworld.d如下:

                   helloworld.o helloworld.d: helloworld.c test.h


        本站是提供個(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)論公約

        類似文章 更多