• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            1.1 makefile helloworld

            Makefile的規(guī)則如下:

            target ... : prerequisites ...

            command ... ...

            target可以是一個(gè)目標(biāo)文件,也可以是Object File(例如helloworld.obj),也可以是執(zhí)行文件和標(biāo)簽。

            prerequisites就是生成target所需要的文件或是目標(biāo)。

            command也就是要達(dá)到target這個(gè)目標(biāo)所需要執(zhí)行的命令。這里沒(méi)有說(shuō)“使用生成target所需要執(zhí)行的命令”,是因?yàn)閠arget可能是標(biāo)簽。需要注意的是command前面必須是TAB鍵,而不是空格,因此喜歡在編輯器里面將TAB鍵用空格替換的人需要特別小心了。

            我們寫(xiě)程序一般喜歡寫(xiě)helloworld,當(dāng)我們寫(xiě)了一個(gè)c的helloworld之后,我們?cè)撊绾螌?xiě)helloworld來(lái)編譯helloworld.c呢?

            下面就是編譯helloworld的makefile。

            helloworld : helloworld.o

            cc -o helloworld helloworld .o

            helloworld.o : helloworld.c

            cc -c main.c

            clean:

            rm helloworld helloworl.o

            之后我們執(zhí)行make就可以編譯helloworld.c了,執(zhí)行make clean就可以清除編譯結(jié)果了(其實(shí)就是刪除helloworld helloworl.o)。

            可能有人問(wèn)為什么執(zhí)行make就會(huì)生成helloworld呢?這得從make的默認(rèn)處理說(shuō)起:make將makefile的第一個(gè)target作為作為最終的

            target,凡是這個(gè)規(guī)則依賴的規(guī)則都將被執(zhí)行,否則就不會(huì)執(zhí)行。所以在執(zhí)行make的時(shí)候,clean這個(gè)規(guī)則就沒(méi)有被執(zhí)行。

            上面的是最簡(jiǎn)單的makefile,復(fù)雜點(diǎn)makefile就開(kāi)始使用高級(jí)點(diǎn)的技巧了,例如使用變量,使用隱式規(guī)則,執(zhí)行負(fù)責(zé)點(diǎn)shell命令(常見(jiàn)的是字符串處理和文件處理等),這里不打算介紹這些規(guī)則,后面在分析android的makefile時(shí)會(huì)結(jié)合具體代碼進(jìn)行具體分析,大家可以先看看陳皓的《跟我一起寫(xiě)makefile》來(lái)了解了解。

            makefile的大體的結(jié)構(gòu)是程序樹(shù)形的,如下:

            image

            這樣寫(xiě)起makefile也簡(jiǎn)單,我們將要達(dá)到的目標(biāo)作為第一個(gè)規(guī)則,然后將目標(biāo)分解成子目標(biāo),然后一個(gè)個(gè)寫(xiě)規(guī)則,依次類推,直到最下面的規(guī)則很容易實(shí)現(xiàn)為止。這其實(shí)和算法里面的分治法很像,將一個(gè)復(fù)雜的問(wèn)題分而治之。

            說(shuō)到樹(shù),我想到了編譯原理里面的語(yǔ)法分析,語(yǔ)法分析里面有自頂而下的分析方法和自底而下的分析方法。當(dāng)然makefile并不是要做語(yǔ)法分析,而是要做與語(yǔ)法分析分析相反的事。(語(yǔ)法分析要做的是一個(gè)句子是不是根據(jù)語(yǔ)法可以推出來(lái),而makefile要做的是根據(jù)規(guī)則生成一個(gè)command 執(zhí)行隊(duì)列。)不過(guò)makefile的規(guī)則和詞法分析還是很像的。下面出一道編譯原理上面的一個(gè)例子,大家可以理解一下makefile和詞法分析的不同點(diǎn)和相同點(diǎn):

            <標(biāo)識(shí)符> -> <字母><字母數(shù)字串>
            <字母數(shù)字串> -> <字母><字母數(shù)字串>|<數(shù)字><字母數(shù)字串>|<下劃線><字母數(shù)字串>|ε
            <無(wú)符號(hào)整數(shù)> -> <數(shù)字><數(shù)字串>
            <數(shù)字串> -> <數(shù)字><數(shù)字串>|ε
            <加法運(yùn)算符> -> +
            <減法運(yùn)算符> -> -
            <大于關(guān)系運(yùn)算符> -> >
            <大于等于關(guān)系運(yùn)算符> -> >=

             

            最后,介紹一下autoconfautomake,使用這兩個(gè)工具可以自動(dòng)生成makefile。

            autoconf

            從上面的圖可以看出,通過(guò)autoscan,我們可以根據(jù)代碼生成一個(gè)叫做configure.scan的文件,然后我們編輯這個(gè)文件,參數(shù)一個(gè)configure.in的文件。接著我們寫(xiě)一個(gè)makefile.am的文件,然后就可以用automake生成makefile.in,最后,根據(jù)makefile.in和configure就可以生成makefile了。在很多開(kāi)源的工程里面,我們都可以看到makefile.am,configure.in,makefine.in,configure文件,還有可能看到一個(gè)十分復(fù)雜的makefile文件,許多人學(xué)習(xí)makefile的時(shí)候想通過(guò)看這個(gè)文件來(lái)學(xué)習(xí),最終卻發(fā)現(xiàn)太復(fù)雜了。如果我們知道這個(gè)文件是自動(dòng)生成的,就理解這個(gè)makefile文件為什么這個(gè)復(fù)雜了。

            欲更加詳細(xì)的理解automake等工具,可以參考http://www.ibm.com/developerworks/cn/linux/l-makefile/

            久久无码AV中文出轨人妻 | 国产精品美女久久久久av爽 | 久久亚洲天堂| 思思久久精品在热线热| 亚洲va久久久噜噜噜久久天堂| 东方aⅴ免费观看久久av| 国产精品禁18久久久夂久| 久久久亚洲精品蜜桃臀| 中文字幕乱码久久午夜| 久久久久99精品成人片欧美| 久久国产精品久久| 色天使久久综合网天天| 中文字幕一区二区三区久久网站| 无码8090精品久久一区| 久久精品九九亚洲精品| 久久综合偷偷噜噜噜色| 伊人色综合久久天天| 久久久av波多野一区二区| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 狠狠久久综合| 久久精品夜夜夜夜夜久久| 久久只有这精品99| 久久久久久国产精品美女 | 久久天天躁狠狠躁夜夜2020| 国产精品无码久久综合| 亚洲精品乱码久久久久久中文字幕| 久久狠狠一本精品综合网| 狠色狠色狠狠色综合久久| 久久大香香蕉国产| 久久精品亚洲中文字幕无码麻豆| 亚洲综合伊人久久综合| 亚洲愉拍99热成人精品热久久| 久久久久久国产a免费观看黄色大片 | 武侠古典久久婷婷狼人伊人| 精品无码人妻久久久久久| 久久国产福利免费| 亚洲Av无码国产情品久久| 天天综合久久一二三区| 久久综合九色综合网站| 无码AV波多野结衣久久| 亚洲精品高清国产一线久久|