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

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

make工具的用法

make工具可以看成是一個智能的批處理工具,它本身并沒有編譯的鏈接的功能,同樣是用類似于批處理的方式,通過調(diào)用用戶指定的語句來進(jìn)行編譯和鏈接。但是,批處理會執(zhí)行全部命令將全部源文件編譯,包括那些不必重新編譯的源文件,而make工具則可根據(jù)目標(biāo)文件上一次編譯的時間和所依賴的源文件的更新時間自動判斷應(yīng)當(dāng)編譯哪些源文件,對沒有更新過的文件不會處理,這樣就可以大大提高程序調(diào)試的效率。

 

舉例說明,我們要寫一個test.exe文件,生成最后的可執(zhí)行文件有4個步驟:

1,編譯源文件x.cpp,其中用到頭文件common.h,它們經(jīng)編譯器編譯成x.obj

2,編譯源文件y.cpp,其中用到頭文件common.hy.h,它們經(jīng)編譯器編譯成y.obj

3,資源腳本文件x.rc,經(jīng)過資源編譯器編譯成x.res

4,最后用鏈接器將x.objy.objx.res鏈接成test.exe

 

 

可以看出,當(dāng)程序調(diào)試的時候,如果修改了x.cpp,也就是說x.obj的文件時間比x.cpp要早,就需要重新進(jìn)行步驟14;如果修改了y.cppy.h,那么需要重新執(zhí)行步驟24;如果修改的是x.rc,則步驟34必須重新執(zhí)行;如果同時修改了common.hx.rc,那么必須重復(fù)全部步驟。在這個例子中,文件的依賴關(guān)系就是:

1test.exe依賴于x.objy.objx.res

2x.res依賴于x.rc

3x.obj依賴于x.cppcommon.h

4y.obj依賴于y.cppcommon.hy.h

 

make可以根據(jù)文件的時間正確判斷文件的新舊并執(zhí)行相應(yīng)的步驟。但make又是如何知道文件之間的依賴關(guān)系呢?這需要用戶用一個描述文件來指定。這個描述文件就叫做makefile,執(zhí)行make工具的時候,它會默認(rèn)用makefile做描述文件名來進(jìn)行相應(yīng)的工作,書寫描述文件有規(guī)定的語法,雖然語法不是很簡單,但寫好以后就省事多了。

 

Microsoftmake工具文件名為nmake.exeBorland公司的make工具文件名是make.exe

兩者默認(rèn)的描述文件名都是makefile,描述文件的語法也大同小異,只是使用時命令行參數(shù)有些不同。

 

nmake的用法

在命令行鍵入namke/? 可以顯示幫助信息,nmake的語法為:

       nmake [選項] [/f 描述文件名] [/x 輸出信息文件名] [宏定義] [目標(biāo)]

 

說明如下:

/f :如果描述文件名不使用默認(rèn)的“makefile”,可以用/f參數(shù)指定。

/x :如果想把屏幕輸出的信息存到一個文件中,可以用/x 參數(shù)指定。(用DOS下的管道操作符 nmake > 文件名的方法無效)。

宏定義:可以用新的定義覆蓋描述文件中的宏定義。

目標(biāo):可以指定建立描述文件中描述的某個文件,如上面的例子中默認(rèn)是生成最后的test.exe文件,也可以用nmake x.res指定更新x.res文件。

 

nmake的常用選項:

/A           不檢測文件更新時間,強(qiáng)制更新所有文件

/B           文件更新時間相等時也要更新文件

/D           make時顯示文件新舊信息

/N           顯示make時要執(zhí)行的命令,但并不真正執(zhí)行

/P           一個比較有用的選擇,make時顯示詳細(xì)的信息

 

由于nmake的應(yīng)用是基于文件時間的,當(dāng)計算機(jī)的時鐘不準(zhǔn)確或文件拷貝到另一臺計算機(jī)后文件時間有些偏差,那么可能文件的更新會不正確,這時最好用/A選項強(qiáng)制把所有文件更新一遍。在平時使用的時候,以makefile當(dāng)做建立的描述文件名,那么僅鍵入不加參數(shù)的nmake命令就可以完成所有工件了。

 

 

描述文件的語法

make工具最主要也是最基本的功能就是通過描述文件來描述源程序之間的相互關(guān)系并自動維護(hù)編譯工作,而描述文件需要按照某種語法進(jìn)行編寫,文件中需要說明如何編譯各個源文件并鏈接生成可執(zhí)行文件,并要求定義源文件之間的依賴關(guān)系,為了更方便使用,文件中同時可以用一些宏定義。描述文件一般需要包含以下內(nèi)容:

l         注釋

l         宏定義

l         顯式規(guī)則

l         隱含規(guī)則

 

在這里,以上面的test.exe的例子寫出一個描述文件,再逐步介紹各部分的書寫語法。為了方便使用,一般都把描述文件的文件名取為默認(rèn)文件名:makefile(無擴(kuò)展名)。這個例子的makefile文件如下:

 

 1 # nmake工具的描述文件例子
 2 EXE = Test.exe             #指定輸出文件
 3 OBJS = x.obj \
 4               y.obj                     #需要的目標(biāo)文件
 5 RES = x.res                  #需要的資源文件
 6 
 7 LINK_FLAG = /subsystem:windows   #鏈接選項
 8 ML_FLAG = //coff                          #編譯選項
 9  
10 #定義依賴關(guān)系和執(zhí)行命令
11 $(EXE) : $(OBJS) $(RES)
12               Link $(LINK_FLAG) /out:$(EXE) $(OBJS) $(RES)
13 $(OBJS) : Common.inc
14 y.obj: y.inc
15  
16 #定義匯編編譯和資源編譯的默認(rèn)規(guī)則
17 .asm .obj:
18               ml $(ML_FLAG) $<
19 .rc .res:
20               rc $<
21 
22 #清除臨時文件
23 clean:
24               del *.obj
25               del *.res
26 

 

1、注釋和換行

makefile中的注釋是以#號開頭一直到行尾的字符,當(dāng)nmake工具處理到這些字符的時候,它會完全忽略#號及全部注釋字符。

 

當(dāng)一行的內(nèi)容過長的時候,可以用換行符來繼續(xù),makefile的換行符是反斜杠\

在使用換行符的時候要注意在反斜杠后面不能再加上其他字符,包括注釋和空格,否則nmake檢測到反斜杠不在一行的最后,就不會把它當(dāng)成換行符解釋,就會出現(xiàn)錯誤。

 

2、宏定義

makefile中允許使用簡單的宏定義指代源文件及其相關(guān)編譯信息,可以把宏稱為變量,在整個描述文件中,只要符合下面語法的行就是宏定義:

       變量名=變量內(nèi)容

 

如上面例子文件中的28行就是宏定義,在引用宏時只需在變量前加$符號,但是要注意的是,如果變量名的長度超過一個字符,在引用時就必須加圓括號(),下面都是有效的宏引用:

       $(LINK_FLAG)

       $(EXE)

       $A

       $(A)

其中最后兩個引用是完全一致的。

 

宏定義的使用可以使makefile的使用更靈活:首先可以使文件便于修改,比如把第8行和第18行中ml的選項部分寫成宏定義,以后要改變編譯選項的時候,只要直接在makefile文件頭部改變宏定義就可以了,不必重新閱讀整個makefile文件;其次,當(dāng)不止一個地方用到同一個文件的時候,把文件名定義為宏定義可以減少錯誤,增加可讀性,同時也可以便于修改;最大的好處是可以直接在命令行中用新的定義覆蓋,比如在命令行中鍵入:

       nmake ML_FLAG – “/c /coff /F1”

那么這時就會以新的/c /coff /F1定義代替makefile中定義的/c /coff,在這種使用中要注意兩個問題,一是宏名稱要區(qū)分大小寫,ML_FLAGml_flag是不一樣的;二是定義值中有空格的時候要用雙引號引起來,沒有空格時可以不用雙引號,如ML_LAG=/c,這使臨時使用不同的參數(shù)編譯文件時可以不必修改makefile

 

3、顯式規(guī)則

makefile中包含有一些規(guī)則,這些規(guī)則定義了文件之間的依賴關(guān)系和產(chǎn)生命令,一個規(guī)則的格式是這樣的:

       目標(biāo)文件:依賴文件;命令              (方法1

      

       目標(biāo)文件:依賴文件

                     命令                                   (方法2

在規(guī)則定義和命令行中,不能包含注釋,例子中的第11行和12行把宏定義展開后就是:

       Test.exe : x.obj y.obj x.res

                     Link /subsystem:windows /out: Test.exe x.obj y.obj x.res

這里的目標(biāo)文件就是Test.exe,它依賴于3個文件x.objy.objx.res,如果有必要,產(chǎn)生目標(biāo)文件的命令就是下面的Link命令,整個規(guī)則可以用兩種方法,用第二種方法的時候,命令可以從第二行開始,第二行的分號“;”省略,但是這時命令前面必須有一個Tab字符,否則nmake無法區(qū)分這究竟是命令還是別的定義。目標(biāo)文件可以有多個,依賴文件也可以有多個,同時命令也可以由多個命令行組成,當(dāng)然這時候就必須用第二種方法定義了。

 

可以也可以用test.exe生成的規(guī)則定義其他文件,如x.objx.res的生成方法,但nmake如何知道哪個是最終要make的文件呢?實際上nmake默認(rèn)將整個描述文件的第一條規(guī)則中目標(biāo)文件認(rèn)為是最終文件,如果我們把1112行放到第13行后面,那x.objy.obj的建立規(guī)則就成了第一條規(guī)則,nmake建立了x.objy.obj之后就不理會test.exe的建立了,所以我們必須把最終需要生成的文件放在第一條規(guī)則定義。當(dāng)然,在nmake的命令行參數(shù)中可以指定要make的目標(biāo),如我們要生成x.res文件,那么不必修改makefilex.res的描述規(guī)則移動到最前面,而是直接在命令行鍵入以下命令即可:

       nmake x.res

 

參數(shù)中也可以同時帶好幾個目標(biāo)文件名,nmake會一一處理,如果指定的目標(biāo)文件沒有對應(yīng)的規(guī)則,nmake會返回一個出錯信息:

       fatal error U1073: don’t know how to make ‘xxx 文件

 

當(dāng)用戶要求nmake去建造一個目標(biāo)時,make會去找到這個目標(biāo)的依賴規(guī)則,這時第二行中的命令并不會立刻就執(zhí)行,而是首先要做一些事情:nmake先去檢查依賴文件是否是另一條規(guī)則的目標(biāo)文件,如果是則先處理這一條規(guī)則,否則不是,nmake再檢查各個依賴文件的時間,看這些文件有沒有比目標(biāo)文件更新的,如果沒有,nmake會決定不再重新建造目標(biāo)文件,并給出提示:“xxx 文件”is up-to-date,如果依賴文件有比目標(biāo)文件更新的,才執(zhí)行命令。

 

所以一個順序下來,所有的目標(biāo)文件以及它們的依賴文件,以信依賴文件的依賴文件都會被檢查并更新,總而言之,一個目標(biāo)文件的建立包含了順序正確的指令鏈接,這個鏈接結(jié)構(gòu)是樹狀的,目標(biāo)文件是根,一級級擴(kuò)展到多個文件,我們要求的是nmake去建立鏈接中處于根部的那個文件,nmake要根據(jù)鏈接結(jié)構(gòu)從目標(biāo)開始向初始狀態(tài)前進(jìn),最后慢慢回來,在這個過程中執(zhí)行建立每個文件所必須的命令,一直到最終目標(biāo)建立完成。

 

目標(biāo)也可以沒有依賴文件,而目標(biāo)也可以不是一個真正存在的文件,如例子第23行到第25行行中的clean是一個目標(biāo),但我們并不是要生成一個clean文件,而是希望在文件調(diào)試完畢后用nmake來清除臨時文件,當(dāng)我們鍵入nmake clean的時候,工作目錄下并沒有clean這個文件,那么nmake就會去執(zhí)行clean定義中的命令,因為nmake把每一個不存在的目標(biāo)當(dāng)做是一個過時的目標(biāo),如此一來,就會刪除中間過程中的文件*.obj*.res

 

指出了目標(biāo)文件全名的規(guī)則稱為顯式規(guī)則,但有些類別的文件的編譯方法可以是雷同的,如從asm文件產(chǎn)生obj文件的命令總是用ml,從rc文件產(chǎn)生res文件的命令總是用rc,對于每個文件都寫一條規(guī)則有些多余,這時候就要用到隱含規(guī)則。

 

4、隱含規(guī)則

隱含規(guī)則可以為某一類的文件指定建立的命令,它具體定義了如何將帶一個特定擴(kuò)展名的文件轉(zhuǎn)換成具有另一種擴(kuò)展名的文件,定義的格式是:

       .源擴(kuò)展名 .目標(biāo)擴(kuò)展名 ;命令          (方法1

      

       .源擴(kuò)展名 .目標(biāo)擴(kuò)展名

                     命令                                          (方法2

 

隱含規(guī)則的語法和顯式規(guī)則相似,也是用“:”隔開,在分號“;”后面書寫命令,也可以不用分號“;”而將命令寫在第二行,同理,這時命令之前要加一個Tab字符。

 

隱含規(guī)則不能有依賴文件,所以冒號“:”后面沒有內(nèi)容,例子中的第1718行定義了從asm文件建立obj文件的隱含規(guī)則,第1920行定義了從rc文件建立res文件的隱含規(guī)則,隱含規(guī)則中無法指定確定的輸入文件名,因為輸入文件名是泛指的有相同擴(kuò)展名的一整類文件,這時候就要用到幾個特殊的內(nèi)定宏來指定文件名,這些宏是$@$*$?$<,它們的含義如下:

       $@         全路徑的目標(biāo)文件。

       $*           除去擴(kuò)展名的全路徑的目標(biāo)文件。

       $?           所有源文件名。

       $<          源文件名(只能用在隱含規(guī)則中)。

所以第1920行中的rc $<用于x.rc的時候就是rc x.rc

 

讀者可能注意到一些顯式規(guī)則沒有命令行,如第13行的$(OBJS): Common.inc指出了所有的obj文件全部依賴于Common.inc文件,第14行的 y.obj:y.inc則指出了y.obj同時也依賴于y.inc和第13行的規(guī)則合并,y.obj依賴于Common.inc也依賴于y.inc,但是這兩個條規(guī)則都沒有指出產(chǎn)生這些obj文件的命令,所以nmake處理的時候會到隱含規(guī)則中去找命令行,最后會用第18行的ml $(ML_FLAG) $<命令去產(chǎn)生這些obj文件。

 

posted on 2010-08-30 10:20 luqingfei 閱讀(2041) 評論(0)  編輯 收藏 引用 所屬分類: C++基礎(chǔ)

導(dǎo)航

<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

統(tǒng)計

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲高清久久| 裸体素人女欧美日韩| 久久久久综合网| 久久www成人_看片免费不卡| 亚洲一区高清| 欧美亚洲系列| 久久偷窥视频| 国产精品久久久久久久久果冻传媒| 欧美成人黑人xx视频免费观看| 欧美国产日韩视频| 欧美小视频在线| 国产色爱av资源综合区| 久久香蕉精品| 久久久www成人免费精品| 亚洲一区在线免费| 欧美在线精品一区| 欧美大片免费| 亚洲小说欧美另类社区| 香蕉乱码成人久久天堂爱免费 | 欧美成年人视频网站欧美| 欧美激情女人20p| 国产精品电影在线观看| 一区在线免费| 在线亚洲激情| 久久综合国产精品| 亚洲天堂免费观看| 免费观看一区| 国产日韩欧美亚洲一区| 日韩视频中文| 久久精品人人| a4yy欧美一区二区三区| 老司机久久99久久精品播放免费 | 欧美日本中文| 国产午夜精品麻豆| 制服诱惑一区二区| 欧美jizz19性欧美| 亚洲欧美日韩国产一区| 欧美激情综合五月色丁香| 国产一区视频网站| 亚洲欧美日韩系列| 亚洲精品国产欧美| 久久久国产精彩视频美女艺术照福利| 欧美日韩网址| 亚洲精品乱码久久久久久黑人| 久久国产精品毛片| 一区二区三区欧美视频| 欧美激情一区二区三区成人| 国产主播喷水一区二区| 午夜欧美电影在线观看| 亚洲三级视频| 欧美激情91| 亚洲三级免费| 欧美国产日韩一区二区三区| 午夜精品一区二区三区电影天堂| 欧美日韩综合| 亚洲午夜精品久久久久久app| 亚洲国产美女精品久久久久∴| 久久全国免费视频| 精品成人久久| 欧美gay视频激情| 看欧美日韩国产| 亚洲国产精品久久精品怡红院| 久久福利影视| 久久久久久9| 亚洲国产高潮在线观看| 韩国三级电影一区二区| 国产精品入口麻豆原神| 亚洲亚洲精品在线观看| 亚洲六月丁香色婷婷综合久久| 欧美精品日本| 亚洲神马久久| 亚洲一区欧美| 国产又爽又黄的激情精品视频| 久久精品国产一区二区三区| 国产精品综合网站| 久久久久久久精| 免播放器亚洲一区| 日韩视频免费看| 一区二区三区四区国产| 国产精品一区三区| 美日韩精品免费观看视频| 久久亚洲欧美国产精品乐播| 亚洲精品久久久久久久久久久久| 亚洲美女在线看| 国产伦精品一区二区三区免费迷| 久久黄金**| 欧美丰满少妇xxxbbb| 亚洲午夜精品国产| 久久精品亚洲一区| 99精品国产热久久91蜜凸| 亚洲天堂偷拍| 国产综合久久久久影院| 91久久精品www人人做人人爽| 欧美日韩国产三区| 久久久久成人精品| 欧美日韩精品一区二区天天拍小说| 欧美在线视频免费观看| 美女999久久久精品视频| 亚洲天堂网站在线观看视频| 久久国产精品毛片| 亚洲一区二区在线| 狂野欧美激情性xxxx| 亚洲欧美日韩国产中文在线| 噜噜噜久久亚洲精品国产品小说| 亚洲欧美国产毛片在线| 女人色偷偷aa久久天堂| 久久精品首页| 欧美日韩理论| 欧美国产一区在线| 国产偷国产偷精品高清尤物| 亚洲精品免费一区二区三区| 精品999在线观看| 亚洲欧美在线另类| 亚洲女同同性videoxma| 六月婷婷一区| 久久一区中文字幕| 国产精品福利片| 亚洲精选91| 亚洲人体大胆视频| 久久久另类综合| 久久久久久久97| 国产欧美日韩三级| 一区二区三区视频在线播放| 亚洲日韩视频| 久久免费视频在线观看| 精品成人一区二区三区| 亚洲一区在线视频| 亚洲欧美激情四射在线日 | 日韩视频一区二区在线观看 | 日韩视频一区二区三区在线播放| 欧美一区二区在线视频| 亚洲午夜在线| 欧美午夜国产| 一本色道**综合亚洲精品蜜桃冫| 亚洲日本欧美| 欧美成人免费小视频| 亚洲高清视频一区二区| …久久精品99久久香蕉国产| 久久久久久亚洲精品中文字幕 | 久热精品在线| 国产一区二区三区免费观看| 亚洲综合欧美| 久久av一区二区三区漫画| 国产精品一区在线观看| 亚洲小视频在线观看| 久久国产精品久久国产精品| 国产精品高潮呻吟久久av黑人| 一区二区欧美亚洲| 欧美亚洲综合在线| 禁久久精品乱码| 欧美激情视频免费观看| 亚洲精品在线三区| 亚洲网站在线播放| 国产视频欧美| 久久青草久久| 亚洲每日在线| 欧美在线观看一二区| 精品91久久久久| 欧美日韩免费观看一区三区| 亚洲午夜精品在线| 久久国产乱子精品免费女| 1000部国产精品成人观看| 欧美成人乱码一区二区三区| 亚洲精品欧美极品| 亚洲免费一级电影| 狠狠爱www人成狠狠爱综合网| 美女网站久久| 亚洲亚洲精品在线观看| 媚黑女一区二区| 亚洲午夜一区二区| 国产原创一区二区| 欧美日韩视频一区二区三区| 亚洲免费在线播放| 亚洲国产精品成人综合色在线婷婷| 亚洲午夜av电影| 亚洲国产日韩欧美| 国产乱人伦精品一区二区| 另类图片国产| 午夜精品久久久| 亚洲精品免费在线观看| 久久精品欧洲| 亚洲欧美三级在线| 日韩视频精品| 伊人精品久久久久7777| 国产精品扒开腿做爽爽爽软件| 久久久久久国产精品mv| 亚洲图片欧洲图片日韩av| 亚洲自拍偷拍视频| 宅男66日本亚洲欧美视频| 玖玖玖免费嫩草在线影院一区| 9l视频自拍蝌蚪9l视频成人| 国产亚洲欧美一区在线观看| 欧美视频一区二区三区| 男人插女人欧美| 久久久www成人免费精品| 性欧美18~19sex高清播放| 99精品国产福利在线观看免费| 欧美激情亚洲激情| 免费成人黄色片| 久久麻豆一区二区|