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

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

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


            一、Makefile的規(guī)則

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

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

                target也就是一個(gè)目標(biāo)文件,可以是Object File,也可以是執(zhí)行文件。還可以是一個(gè)標(biāo)簽(Label),對于標(biāo)簽這種特性,在后續(xù)的“偽目標(biāo)”章節(jié)中會有敘述。

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

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

            這是一個(gè)文件的依賴關(guān)系,也就是說,target這一個(gè)或多個(gè)的目標(biāo)文件依賴于prerequisites中的文件,其生成規(guī)則定義在command中。說白一點(diǎn)就是說,prerequisites中如果有一個(gè)以上的文件比target文件要新的話,command所定義的命令就會被執(zhí)行。這就是Makefile的規(guī)則。也就是Makefile中最核心的內(nèi)容。

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


            二、一個(gè)示例

            正如前面所說的,如果一個(gè)工程有3個(gè)頭文件,和8個(gè)C文件,我們?yōu)榱送瓿汕懊嫠龅哪侨齻€(gè)規(guī)則,我們的Makefile應(yīng)該是下面的這個(gè)樣子的。

                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的易讀。我們可以把這個(gè)內(nèi)容保存在文件為“Makefile”或“makefile”的文件中,然后在該目錄下直接輸入命令“make”就可以生成執(zhí)行文件edit。如果要?jiǎng)h除執(zhí)行文件和所有的中間目標(biāo)文件,那么,只要簡單地執(zhí)行一下“make clean”就可以了。

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

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

            這里要說明一點(diǎn)的是,clean不是一個(gè)文件,它只不過是一個(gè)動作名字,有點(diǎn)像C語言中的lable一樣,其冒號后什么也沒有,那么,make就不會自動去找文件的依賴性,也就不會自動執(zhí)行其后所定義的命令。要執(zhí)行其后的命令,就要在make命令后明顯得指出這個(gè)lable的名字。這樣的方法非常有用,我們可以在一個(gè)makefile中定義不用的編譯或是和編譯無關(guān)的命令,比如程序的打包,程序的備份,等等。
            Posted on 2007-04-17 10:48 艾凡赫 閱讀(620) 評論(0)  編輯 收藏 引用 所屬分類: C++
            精品久久久久中文字| 国产Av激情久久无码天堂| 久久婷婷五月综合97色| 性高湖久久久久久久久AAAAA| 国产呻吟久久久久久久92| 久久精品国产福利国产秒| 国内精品久久久久久久97牛牛| 99久久精品日本一区二区免费| 久久亚洲AV成人无码国产| 91精品国产高清91久久久久久| 大伊人青草狠狠久久| 久久国产精品久久国产精品| 丁香久久婷婷国产午夜视频| 久久精品成人| 日韩久久久久久中文人妻| 久久久久无码精品国产| 99久久精品国产一区二区蜜芽| 久久99久久无码毛片一区二区| 无码国内精品久久人妻麻豆按摩| 久久精品国产99国产精品导航| 欧美黑人激情性久久| 久久亚洲高清观看| 少妇久久久久久被弄到高潮| 国产美女亚洲精品久久久综合| 久久久国产精品福利免费 | 久久香蕉国产线看观看乱码| 2021国产成人精品久久| 麻豆久久久9性大片| 久久发布国产伦子伦精品| 精品久久久久久无码人妻蜜桃| 精品久久久久成人码免费动漫| 99久久精品国产高清一区二区| 久久AⅤ人妻少妇嫩草影院| 伊人久久综合成人网| 一本大道加勒比久久综合| 亚洲精品美女久久久久99| 97精品国产97久久久久久免费| 欧美牲交A欧牲交aⅴ久久| 久久伊人亚洲AV无码网站| 日本精品久久久久中文字幕| 伊人久久大香线蕉亚洲|