青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 14, comments - 1, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

makefile續

Posted on 2009-09-03 12:57 ggh 閱讀(411) 評論(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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩国产一区| 亚洲精品国产日韩| 亚洲免费影视| 欧美激情亚洲激情| 亚洲中字黄色| 国产精品电影观看| 亚洲调教视频在线观看| 亚洲第一精品在线| 久久久久**毛片大全| 国产亚洲日本欧美韩国| 午夜影视日本亚洲欧洲精品| 亚洲国产欧美一区二区三区久久| 久久狠狠婷婷| 合欧美一区二区三区| 久久蜜桃精品| 欧美一级理论片| 国产欧美一区二区精品婷婷 | 久久亚洲国产精品一区二区| 一本一本久久a久久精品综合妖精| 欧美高清自拍一区| 亚洲理论在线| 99国产精品久久久| 欧美色播在线播放| 亚洲欧美影院| 欧美一区二区三区四区高清 | 日韩视频在线观看国产| 亚洲精品网址在线观看| 欧美人在线视频| 亚洲一区二区在线视频| 亚洲一区二区三区免费在线观看 | 在线免费精品视频| 亚洲激情另类| 欧美日韩综合在线| 欧美一区二区观看视频| 久久精品网址| 亚洲高清免费视频| 亚洲人人精品| 国产精品外国| 亚洲一区二区三区影院| 国内外成人在线视频| 久久久久久久久久久久久久一区 | 国产亚洲永久域名| 蜜桃视频一区| 欧美日韩一区二区三区| 性欧美在线看片a免费观看| 久久免费观看视频| 亚洲毛片av在线| 亚洲视频网在线直播| 国产综合av| 亚洲欧洲三级| 国产一区二区三区丝袜| 亚洲国产精品久久久久秋霞影院| 欧美破处大片在线视频| 久久综合九色综合网站| 欧美日韩国产在线播放| 久久久久国产精品麻豆ai换脸| 久久综合色影院| 欧美在线网站| 欧美精品色综合| 久久久久久成人| 欧美视频手机在线| 牛牛国产精品| 国产一区导航| 夜夜躁日日躁狠狠久久88av| 在线免费观看日本一区| 亚洲欧美在线网| 夜夜狂射影院欧美极品| 久久香蕉国产线看观看网| 在线亚洲精品| 欧美国产在线观看| 美乳少妇欧美精品| 国产欧美一区二区视频| 亚洲精品视频在线观看免费| 亚洲福利视频免费观看| 久久国产精品一区二区三区| 亚洲一区二区网站| 欧美国产日韩一区二区在线观看| 久久婷婷国产麻豆91天堂| 欧美视频在线播放| 91久久精品日日躁夜夜躁欧美| 国产一区成人| 性一交一乱一区二区洋洋av| 亚洲一卡久久| 欧美日韩亚洲综合| 日韩视频免费大全中文字幕| 亚洲人成人99网站| 你懂的一区二区| 久久亚洲精品一区| 国产一区二区三区久久久| 亚洲欧美一区二区在线观看| 亚洲欧美另类在线| 欧美亚州韩日在线看免费版国语版| 欧美aⅴ99久久黑人专区| 精品动漫一区| 久久久久网址| 欧美高清在线播放| 亚洲电影免费| 老牛嫩草一区二区三区日本| 欧美激情精品久久久久久免费印度 | 国产精品色婷婷久久58| 夜夜嗨网站十八久久| 99国产一区| 欧美激情欧美狂野欧美精品| 亚洲国产毛片完整版 | 永久免费毛片在线播放不卡| 久久久国产精彩视频美女艺术照福利| 欧美专区亚洲专区| 一区二区亚洲精品国产| 久久在线精品| 91久久极品少妇xxxxⅹ软件| 亚洲精品日韩在线| 欧美日韩一区二区国产| 亚洲欧美国产精品va在线观看| 亚洲欧美日本在线| 黄色成人在线| 欧美va亚洲va日韩∨a综合色| 亚洲精品乱码久久久久久蜜桃91| 一区二区三区精品视频在线观看 | 最新日韩中文字幕| 欧美日韩伦理在线免费| 亚洲视频一二三| 久久精品亚洲| 日韩视频永久免费| 国产精品婷婷午夜在线观看| 久久亚洲私人国产精品va| 亚洲成人自拍视频| 亚洲与欧洲av电影| 精品999在线播放| 欧美激情国产日韩精品一区18| av成人免费在线观看| 久久精品在线免费观看| 日韩视频在线一区二区三区| 国产美女精品一区二区三区| 美女爽到呻吟久久久久| 一区二区三区四区蜜桃| 久久久一二三| 亚洲在线不卡| 亚洲国产成人久久综合一区| 欧美四级在线观看| 久久天天综合| 午夜精品成人在线视频| 亚洲国产成人久久| 久久精品日韩欧美| 亚洲五月六月| 亚洲大片精品永久免费| 国产精品视频一区二区三区| 美女视频黄免费的久久| 欧美一区二区三区在线视频 | 国产精品久久久久天堂| 美女黄毛**国产精品啪啪| 亚洲午夜电影在线观看| 亚洲动漫精品| 久久午夜电影网| 欧美一区二区三区在| 一本一本久久a久久精品牛牛影视| 国产日韩欧美一区二区三区四区| 欧美日韩日本国产亚洲在线| 久久综合九色综合欧美就去吻 | 理论片一区二区在线| 亚洲女ⅴideoshd黑人| 亚洲一区二区久久| 欧美日韩免费观看一区二区三区| 久久精品青青大伊人av| 亚洲一二三区在线| 99国产精品久久久久久久| 亚洲第一福利在线观看| 久久久久九九视频| 久久久国产精品一区| 亚洲一区综合| 亚洲素人在线| 99精品热视频只有精品10| 亚洲九九爱视频| 亚洲国产精品va| 1024成人| 亚洲第一综合天堂另类专| 国产亚洲综合精品| 国内精品福利| 黄网动漫久久久| 永久久久久久| 亚洲激情视频在线| 亚洲精品欧美日韩| 日韩一区二区精品视频| 亚洲免费观看视频| 一区二区欧美亚洲| 一区二区三区免费观看| 亚洲视频一起| 亚洲女人av| 久久国产精品久久久久久久久久| 性欧美video另类hd性玩具| 欧美中文字幕精品| 久久久噜噜噜久久| 亚洲成人直播| 日韩视频永久免费| 亚洲图片欧洲图片日韩av| 亚洲午夜精品视频| 久久国产精彩视频| 美女主播一区| 欧美久久一区| 国产精品影视天天线| 国产一区二区久久|