• <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 - 14, comments - 1, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            makefile續

            Posted on 2009-09-03 12:57 ggh 閱讀(396) 評論(0)  編輯 收藏 引用

            makefile文件是win32匯編程序中不可少的一部分,類似于dos匯編下的bat文件

            它一般需要包含以下內容

            1.注釋

            2.宏定義

            3.顯示規則

            4.隱含規則

            為了方便使用,一般都把描述文件的文件名取為默認文件名:makefile。這個例子的makefile文件如下(注意前面括號里的是行號,不是文件的真正內容):

            (001)   # nmake工具的描述文件例子
            (002)   EXE = Test.exe      #指定輸出文件
            (003)   OBJS = x.obj \
            (004)       y.obj       #需要的目標文件
            (005)   RES = x.res     #需要的資源文件
            (006)  
            (007)   LINK_FLAG = /subsystem:windows #鏈接選項
            (008)   ML_FLAG = /c /coff      #編譯選項
            (009)  
            (010)   #定義依賴關系和執行命令
            (011)   $(EXE): $(OBJS) $(RES)
            (012)       Link $(LINK_FLAG) /out:$(EXE) $(OBJS) $(RES)
            (013)   $(OBJS): Common.inc
            (014)   y.obj: y.inc
            (015)
            (016)   #定義匯編編譯和資源編譯的默認規則
            (017)   .asm.obj:
            (018)       ml $(ML_FLAG) $<
            (019)   .rc.res:
            (020)       rc $<
            (021)  
            (022)   #清除臨時文件
            (023)   clean:
            (024)       del *.obj
            (025)       del *.res
            1. 注釋和換行
            makefile中的注釋是以#號開頭一直到行尾的字符,當nmake工具處理到這些字符的時候,它會完全忽略#號及全部注釋字符。
            當一行的內容過長的時候,可以用換行符來繼續,makefile的換行符是\,如例子中的第三行和第四行可以合并為:
            OBJS = x.obj y.obj     #需要的目標文件
            在使用換行符的時候要注意在“\”后面不能再加上其他字符,包括注釋和空格,否則nmake檢測到“\”不在一行的最后,就不會把它當成換行符解釋,就會出現錯誤。
            2. 宏定義
            makefile中允許使用簡單的宏定義指代源文件及其相關編譯信息,可以把宏稱為變量,在整個描述文件中,只要符合下面語法的行就是宏定義:
            變量名=變量內容
            如上面例子文件中的2到8就是宏定義,在引用宏時只需在變量前加$符號,但是要注意的是,如果變量名的長度超過一個字符,在引用時就必須加圓括號(),下面都是有效的宏引用:
            $(LINK_FLAG)
            $(EXE)
            $A
            $(A)
            其中最后兩個引用是完全一致的。
            宏定義的使用可以使makefile的使用更靈活:首先可以使文件便于修改,比如把第8行和第18行中ml的選項部分寫成宏定義,以后要改變編譯選項的時候,只要直接在makefile文件頭部改變宏定義就可以了,不必重新閱讀整個makefile文件;其次,當不止一個地方用到同一個文件的時候,把文件名定義為宏定義可以減少錯誤,增加可讀性,同時也可以便于修改;最大的好處是可以直接在命令行中用新的宏定義覆蓋,比如在命令行中鍵入:
            nmake ML_FLAG="/c /coff /Fl"
            那么這時就會以新的/c /coff /Fl定義代替makefile中定義的/c /coff,在這種使用中要注意兩個問題,一是宏名稱要區分大小寫,ML_FLAG和ml_flag是不一樣的;二是定義值中有空格的時候要用雙引號引起來,沒有空格時可以不用雙引號,如ML_FLAG=/c,這使臨時使用不同的參數編譯文件時可以不必修改makefile。
            3. 顯式規則
            makefile中包含有一些規則,這些規則定義了文件之間的依賴關系和產生命令,一個規則的格式是這樣的:
            目標文件:依賴文件;命令            (方法1)

            目標文件:依賴文件             (方法2)
                    命令
            在規則定義和命令行中,不能包含注釋,例子中的第11和12行把宏定義展開后就是:
            test.exe:x.obj y.obj x.res
                Link /subsystem:windows /out:test.exe x.obj y.obj x.res
            這里的目標文件就是test.exe,它依賴于3個文件x.obj,y.obj和x.res,如果有必要,產生目標文件的命令就是下面的Link命令,整個規則可以用兩種方法,用第二種方法的時候,命令可以從第二行開始,第一行的“;”省略,但是這時命令前面必須有一個Tab字符,否則nmake無法區分這究竟是命令還是別的定義。目標文件可以有多個,依賴文件也可以有多個,同時命令也可以由多個命令行組成,當然這時候就必須用第二種方法定義了。
            我們也可以用test.exe生成的規則定義其他文件,如x.obj或x.res的生成方法,但nmake如何知道哪個是最終要make的文件呢?實際上nmake默認將整個描述文件的第一條規則中的目標文件認為是最終文件,如果我們把11,12行放到第13行后面,那么x.obj和y.obj的建立規則就成了第一條規則,nmake建立了x.obj和x.obj之后就不理會test.exe的建立了,所以我們必須把最終需要生成的文件放在第一條規則定義。當然,在nmake的命令行參數中可以指定要make的目標,如我們要生成x.res文件,那么不必修改makefile將x.res的描述規則移動到最前面,而是直接在命令行鍵入以下命令即可:
            nmake x.res
            參數中也可以同時帶好幾個目標文件名,nmake會一一處理,如果指定的目標文件沒有對應的規則,nmake會返回一個出錯信息:
            fatal error U1073: don't know how to make 'xxx文件'
            當用戶要求nmake去建造一個目標時,make會去找到這個目標的依賴規則,這時第二行中的命令并不會立刻就執行,而是首先要做一些事情:nmake先去檢查依賴文件是否是另一條規則的目標文件,如果是則先處理這一條規則,否則不是,nmake再檢查各個依賴文件的時間,看這些文件有沒有比目標文件更新的,如果沒有,nmake會決定不再重新建造目標文件,并給出提示:'xxx文件' is up-to-date,如果依賴文件有比目標文件更新的,才執行命令。
            所以一個順序下來,所有的目標文件以及它們的依賴文件,以及依賴文件的依賴文件都會被檢查并更新,總而言之,一個目標文件的建立包含了順序正確的指令鏈接,這個鏈接結構是樹狀的,目標文件是根,一級級擴展到多個文件,我們要求的是nmake去建立鏈接中處于根部的那個文件,nmake會根據鏈接結構從目標開始向初始狀態前進,最后慢慢回來,在這個過程中執行建立每個文件所必須的命令,一直到最終目標建立完成。
            目標也可以沒有依賴文件,而且目標也可以不是一個真正存在的文件,如例子第23行到第25行中的clean是一個目標,但我們并不是要生成一個clean文件,而是希望在文件調試完畢后用nmake來清除臨時文件,當我們鍵入nmake clean的時候,工作目錄下并沒有clean這個文件,那么nmake就會去執行clean定義中的命令,因為nmake把每一個不存在的目標當做是一個過時的目標,如此一來,就會刪除中間過程中的文件*.obj和*.res。
            指出了目標文件全名的規則稱為顯式規則,但有些類別的文件的編譯方法可以是雷同 的,如從asm文件產生obj文件的命令總是用ml,從rc文件產生res文件的命令總是用rc,對于每個文件都寫一條規則有些多余,這時候就要用到隱含規則。
            4. 隱含規則
            隱含規則可以為某一類的文件指出建立的命令,它具體定義了如何將帶一個特定擴展名的文件轉換成具有另一種擴展名的文件,定義的格式是:
            .源擴展名.目標擴展名:;命令        (方法1)

            .源擴展名.目標擴展名:         (方法2)
                命令
            隱含規則的語法和顯式規則相似,也是用“:”隔開,在“;”下面書寫命令,也可以不用“;”而將命令寫在第二行,同理,這時命令之前要加一個Tab字符。
            隱含規則不能有依賴文件,所以“:”下面沒有內容,例子中的第17、18行定義了從asm文件建立obj文件的隱含規則,第19和20行定義了從rc文件建立res文件的隱含規則,隱含規則中無法指定確定的輸入文件名,因為輸入文件名是泛指的有相同擴展名的一整類文 件,這時候就要用到幾個特殊的內定宏來指定文件名,這些宏是$@,$*,$?和$<,它們的含義如下:
            ●   $@ —— 全路徑的目標文件。
            ●   $* —— 除去擴展名的全路徑的目標文件。
            ●   $? —— 所有源文件名。
            ●   $< —— 源文件名(只能用在隱含規則中)。
            所以第19、20行中的rc $< 用于x.rc的時候就是rc x.rc。
            讀者可以注意到一些顯式規則沒有命令行,如第13行的“$(OBJS): Common.inc”指出了所有的obj文件全部依賴于Common.inc文件,第14行的“y.obj: y.inc”則指出了y.obj同時也依賴于y.inc和第13行的規則合并,y.obj依賴于Common.inc也依賴于y.inc,但是這兩條規則都沒有指出產生這些obj文件的命令,所以nmake處理的時候會到隱含規則中去找命令行,最后會用第18行的“ml $(ML_FLAG) $<”命令去產生這些obj文件。


            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/hust_chen/archive/2008/04/25/2329368.aspx

            欧美一级久久久久久久大| 综合网日日天干夜夜久久| 国内精品伊人久久久久AV影院| 亚洲综合日韩久久成人AV| 久久人人添人人爽添人人片牛牛| 久久青青草原亚洲av无码app| 欧美综合天天夜夜久久| 久久久久久久久波多野高潮| 久久超乳爆乳中文字幕| 久久国产一片免费观看| 天堂久久天堂AV色综合| 国产成人无码精品久久久久免费 | 无码精品久久一区二区三区| 色欲av伊人久久大香线蕉影院| 免费观看久久精彩视频| 久久青青草视频| 日韩欧美亚洲综合久久影院d3| 超级97碰碰碰碰久久久久最新| 亚洲天堂久久精品| 性做久久久久久久| 国产精品中文久久久久久久| 婷婷久久综合九色综合98| 亚洲AV无一区二区三区久久 | 亚洲精品美女久久久久99小说| 国内精品久久久久影院日本| 精品久久久久久无码不卡| 国内精品久久久久久久久| 国产精品久久久久天天影视| 亚洲国产精品无码久久一区二区| 久久性生大片免费观看性| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久久久亚洲AV成人网| 91精品国产91久久久久久青草 | 久久久久久久久久久久久久| 久久久久亚洲AV综合波多野结衣| 99久久精品费精品国产一区二区 | 日韩精品国产自在久久现线拍| 国产人久久人人人人爽| 精品久久久久久国产潘金莲| 久久99精品久久久久子伦| 久久无码人妻一区二区三区|