• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            1.1 makefile helloworld

            Makefile的規則如下:

            target ... : prerequisites ...

            command ... ...

            target可以是一個目標文件,也可以是Object File(例如helloworld.obj),也可以是執行文件和標簽。

            prerequisites就是生成target所需要的文件或是目標。

            command也就是要達到target這個目標所需要執行的命令。這里沒有說“使用生成target所需要執行的命令”,是因為target可能是標簽。需要注意的是command前面必須是TAB鍵,而不是空格,因此喜歡在編輯器里面將TAB鍵用空格替換的人需要特別小心了。

            我們寫程序一般喜歡寫helloworld,當我們寫了一個c的helloworld之后,我們該如何寫helloworld來編譯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

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

            可能有人問為什么執行make就會生成helloworld呢?這得從make的默認處理說起:make將makefile的第一個target作為作為最終的

            target,凡是這個規則依賴的規則都將被執行,否則就不會執行。所以在執行make的時候,clean這個規則就沒有被執行。

            上面的是最簡單的makefile,復雜點makefile就開始使用高級點的技巧了,例如使用變量,使用隱式規則,執行負責點shell命令(常見的是字符串處理和文件處理等),這里不打算介紹這些規則,后面在分析android的makefile時會結合具體代碼進行具體分析,大家可以先看看陳皓的《跟我一起寫makefile》來了解了解。

            makefile的大體的結構是程序樹形的,如下:

            image

            這樣寫起makefile也簡單,我們將要達到的目標作為第一個規則,然后將目標分解成子目標,然后一個個寫規則,依次類推,直到最下面的規則很容易實現為止。這其實和算法里面的分治法很像,將一個復雜的問題分而治之。

            說到樹,我想到了編譯原理里面的語法分析,語法分析里面有自頂而下的分析方法和自底而下的分析方法。當然makefile并不是要做語法分析,而是要做與語法分析分析相反的事。(語法分析要做的是一個句子是不是根據語法可以推出來,而makefile要做的是根據規則生成一個command 執行隊列。)不過makefile的規則和詞法分析還是很像的。下面出一道編譯原理上面的一個例子,大家可以理解一下makefile和詞法分析的不同點和相同點:

            <標識符> -> <字母><字母數字串>
            <字母數字串> -> <字母><字母數字串>|<數字><字母數字串>|<下劃線><字母數字串>|ε
            <無符號整數> -> <數字><數字串>
            <數字串> -> <數字><數字串>|ε
            <加法運算符> -> +
            <減法運算符> -> -
            <大于關系運算符> -> >
            <大于等于關系運算符> -> >=

             

            最后,介紹一下autoconfautomake,使用這兩個工具可以自動生成makefile。

            autoconf

            從上面的圖可以看出,通過autoscan,我們可以根據代碼生成一個叫做configure.scan的文件,然后我們編輯這個文件,參數一個configure.in的文件。接著我們寫一個makefile.am的文件,然后就可以用automake生成makefile.in,最后,根據makefile.in和configure就可以生成makefile了。在很多開源的工程里面,我們都可以看到makefile.am,configure.in,makefine.in,configure文件,還有可能看到一個十分復雜的makefile文件,許多人學習makefile的時候想通過看這個文件來學習,最終卻發現太復雜了。如果我們知道這個文件是自動生成的,就理解這個makefile文件為什么這個復雜了。

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

            色婷婷久久久SWAG精品| 久久久婷婷五月亚洲97号色| 亚洲一本综合久久| 国产精品欧美亚洲韩国日本久久| 狠狠色综合网站久久久久久久| 伊人久久大香线蕉AV一区二区| 亚洲国产精品无码久久98| 国产一久久香蕉国产线看观看 | 99热热久久这里只有精品68| 久久久久婷婷| 精品人妻久久久久久888| 性欧美大战久久久久久久| 久久国产精品一国产精品金尊| 久久国产视屏| 老司机国内精品久久久久| 久久国产免费直播| 久久久久久亚洲精品无码| 99久久久国产精品免费无卡顿| 99久久国产亚洲综合精品| 精品久久久久久无码中文野结衣| 久久亚洲熟女cc98cm| 久久久99精品成人片中文字幕| 久久久久人妻精品一区| 亚洲综合日韩久久成人AV| 国产国产成人久久精品| 久久精品国产福利国产秒| 亚洲国产欧美国产综合久久| 色综合合久久天天给综看| 国产成人99久久亚洲综合精品| 国产情侣久久久久aⅴ免费| 亚洲精品乱码久久久久66| 一本久久综合亚洲鲁鲁五月天| 99久久婷婷国产综合精品草原| 国产精品久久久福利| 国产99精品久久| 国内精品久久久久伊人av| 精品永久久福利一区二区| 国产精品99久久99久久久| 99久久er这里只有精品18| 久久午夜无码鲁丝片| 91精品国产91久久久久福利|