• <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>
            make命令執行時,需要一個 Makefile 文件,以告訴make命令需要怎么樣的去編譯和鏈接程序。

            首先,我們用一個示例來說明Makefile的書寫規則。以便給大家一個感興認識。這個示例來源于GNU的make使用手冊,在這個示例中,我們的工程有8個C文件,和3個頭文件,我們要寫一個Makefile來告訴make命令如何編譯和鏈接這幾個文件。我們的規則是:
                1)如果這個工程沒有編譯過,那么我們的所有C文件都要編譯并被鏈接。
                2)如果這個工程的某幾個C文件被修改,那么我們只編譯被修改的C文件,并鏈接目標程序。
                3)如果這個工程的頭文件被改變了,那么我們需要編譯引用了這幾個頭文件的C文件,并鏈接目標程序。

            只要我們的Makefile寫得夠好,所有的這一切,我們只用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。


            一、Makefile的規則

            在講述這個Makefile之前,還是讓我們先來粗略地看一看Makefile的規則。

                target ... : prerequisites ...
                        command
                        ...
                        ...

                target也就是一個目標文件,可以是Object File,也可以是執行文件。還可以是一個標簽(Label),對于標簽這種特性,在后續的“偽目標”章節中會有敘述。

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

                command也就是make需要執行的命令。(任意的Shell命令)

            這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴于prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。

            說到底,Makefile的東西就是這樣一點,好像我的這篇文檔也該結束了。呵呵。還不盡然,這是Makefile的主線和核心,但要寫好一個Makefile還不夠,我會以后面一點一點地結合我的工作經驗給你慢慢到來。內容還多著呢。:)


            二、一個示例

            正如前面所說的,如果一個工程有3個頭文件,和8個C文件,我們為了完成前面所述的那三個規則,我們的Makefile應該是下面的這個樣子的。

                edit : main.o kbd.o command.o display.o \
                       insert.o search.o files.o utils.o
                        cc -o edit main.o kbd.o command.o display.o \
                                   insert.o search.o files.o utils.o

                main.o : main.c defs.h
                        cc -c main.c
                kbd.o : kbd.c defs.h command.h
                        cc -c kbd.c
                command.o : command.c defs.h command.h
                        cc -c command.c
                display.o : display.c defs.h buffer.h
                        cc -c display.c
                insert.o : insert.c defs.h buffer.h
                        cc -c insert.c
                search.o : search.c defs.h buffer.h
                        cc -c search.c
                files.o : files.c defs.h buffer.h command.h
                        cc -c files.c
                utils.o : utils.c defs.h
                        cc -c utils.c
                clean :
                        rm edit main.o kbd.o command.o display.o \
                           insert.o search.o files.o utils.o

            反斜杠(\)是換行符的意思。這樣比較便于Makefile的易讀。我們可以把這個內容保存在文件為“Makefile”或“makefile”的文件中,然后在該目錄下直接輸入命令“make”就可以生成執行文件edit。如果要刪除執行文件和所有的中間目標文件,那么,只要簡單地執行一下“make clean”就可以了。

            在這個makefile中,目標文件(target)包含:執行文件edit和中間目標文件(*.o),依賴文件(prerequisites)就是冒號后面的那些 .c 文件和 .h文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件 edit 的依賴文件。依賴關系的實質上就是說明了目標文件是由哪些文件生成的,換言之,目標文件是哪些文件更新的。

            在定義好依賴關系后,后續的那一行定義了如何生成目標文件的操作系統命令,一定要以一個Tab鍵作為開頭。記住,make并不管命令是怎么工作的,他只管執行所定義的命令。make會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的話,那么,make就會執行后續定義的命令。

            這里要說明一點的是,clean不是一個文件,它只不過是一個動作名字,有點像C語言中的lable一樣,其冒號后什么也沒有,那么,make就不會自動去找文件的依賴性,也就不會自動執行其后所定義的命令。要執行其后的命令,就要在make命令后明顯得指出這個lable的名字。這樣的方法非常有用,我們可以在一個makefile中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份,等等。
            Posted on 2007-04-17 10:48 艾凡赫 閱讀(626) 評論(0)  編輯 收藏 引用 所屬分類: C++
            亚洲国产成人久久综合一区77| 亚洲国产精品无码久久青草| 思思久久99热只有频精品66| 亚洲国产成人精品女人久久久 | 午夜精品久久久久成人| 思思久久99热免费精品6| 色88久久久久高潮综合影院| www性久久久com| 亚洲人AV永久一区二区三区久久| 人妻精品久久无码区| 精品人妻伦九区久久AAA片69| 99久久无色码中文字幕人妻| 成人久久精品一区二区三区| 久久夜色精品国产| 久久精品国产只有精品2020| 久久久久久久亚洲精品| 久久午夜伦鲁片免费无码| 久久久国产精品| 国产国产成人久久精品| 香蕉久久av一区二区三区 | 亚洲欧洲精品成人久久曰影片| 国内精品久久人妻互换| 欧美日韩精品久久久久| 精品久久久久久无码中文野结衣| 国产亚洲精久久久久久无码| 一级做a爰片久久毛片看看| 久久91这里精品国产2020| 久久精品www| 久久精品成人免费看| 久久久久久人妻无码| 一本色道久久99一综合| 九九精品久久久久久噜噜| 久久久噜噜噜久久| 国产一区二区精品久久凹凸| 伊人久久大香线蕉精品| 国产日产久久高清欧美一区| 99久久精品国产高清一区二区 | 香蕉久久夜色精品国产尤物| 国产精品美女久久久久av爽 | 国产精品一久久香蕉产线看| 亚洲精品无码成人片久久|