windows 下使用makefile(二)---- 編譯

來源:互聯網
上載者:User

標籤:

之所以需要另外設定" 執行時需要="" mspdb60.dll,而它被安裝於="" c:\msdev\common\msdev98\bin="" 之中。<="" p><p>如果你寫的程式不只是單純的="" 程式,還用到了="" mfc,一樣可以在="" console="" mode="" 下編譯,這時候你的環境變數應該如此設定:<="" mfc\include="" 和="" mfc\lib,就可以讓編譯器和連接器找到="" mfc="" 的="" libraries。如果你還需要用到="" atl,就得在="" 環境變數中再加上="" c:\msdev\vc98\atl\include。<="" files\microsoft="" studio下,所以改寫批次檔如下:<="" studio\vc98\bin;d:\program="" studio\common\msdev98\bin="" studio\vc98\include;d:\program="" studio\vc98\mfc\include="" studio\vc98\lib;d:\program="" studio\vc98\mfc\lib<="" p><p>然後運行cmd,將以上設定複製粘貼到滑鼠閃爍處。如果想要確認路徑更改正確,可以鍵入set命令查看。<="" p><p>註:這樣的環境變數修改,僅對本次命令列視窗有效,因為它是一個虛擬設備。如果想要每次進入時,不做這個工作。可以運行vcvars32.bat然後設定你的環境變數。為了不影響vc++的原本設定方便Integration Environment的使用,我並沒有實際操作,一個簡單的複製粘貼也不見得麻煩。另外還可以在我的電腦-屬性-進階-環境變數裡直接修改,這個修改也是永久性的。到這裡,路徑就設定好了。下面試操作一下:<="" p><p>我在f:\盤儲存了一個test.cpp檔案作為測試檔案。檔案內容如下:<="" #include="" <iostream.h>="" void="" main()="" {=""  cout<<"hello"<<endl;="" }="========================================

使用cd命令把當前命令列視窗路徑切換到F:\>,然後執行cl" test.cpp命令,在f:\盤路徑下產生了兩個檔案,test.obj和test.exe。然後再運行test.exe,就可以看到結果了(輸出hello)。<="" p><p>下面再舉一個例子,也就是下面要學習的makefile檔案。測試檔案名為mypath.mak(你可以任意取名),依舊儲存在當前路徑下。<="" all:  =""  ="" @echo  ="" $(path)="=========================

運行命令nmake" mypath.mak,你可以看到輸出結果為你剛才設定過的路徑(我的結果是d:\program="" studio\common\msdev98\bin)。<="" p><p>2.產生自己的makefile檔案<="" p><p>下面是我在網上找到的一個簡單的例子及其解說(<a="" target="_blank" href="http://www.readygo.com.cn/it-1104697.html" >http:="" www.readygo.com.cn="" it-1104697.html<="" a>)<="" 下面來看一個簡單的例子(以下內容均以win32平台為例):  ="" 檔案名稱:makefile  ="" 1.  ="" #  ="" makefile  ="" 2.  ="" this  ="" is  ="" a  ="" example  ="" of  ="" make  ="" file  ="" 3.  ="" all:a1  ="" a2  ="" 4.      ="" all!  ="" 5.  ="" a1:  ="" 6.      ="" a1!  ="" 7.  ="" a2:  ="" 8.      ="" a2!  =""    ="" 運行make後,結果如下:  =""  現在讓我們來分析一下這個簡單的規則檔案。=""   =""       ="" 第1、2行不用說,一眼就可以看出是注釋。在make規則檔案中,注釋是以“#”開始,是行注釋,和c++中的“="" ”功能一樣。不過你可不能把它放到其它的語句之後,否則就錯了。第3行就是規則開始了!all:a1  ="" a2一行中,規則的名字就是all,它通常是目標名(target)。一條規則可以有不止一個名字,像這一行,你也可以把它寫成all  ="" all2:a1  ="" a2。這時,規則就有了兩個名稱—all和all2。當然,還可以有更多,都看你自己。後面的5、7兩行也分別是兩條規則的起始。在“:”之後的,就是依賴項。在這一行裡,依賴項有兩個,分別是a1和a2。這些依賴項可以是其它的規則名(目標名),也可以是檔案名稱。依賴和目標之間的關係就是“依賴關係”。一條規則中,可以有零個(像後面的兩條規則)、一個或多個依賴。第4行@echo  ="" all!是命令列。它是執行all規則時要執行的命令。要注意的是,一條規則內的命令要以tab為一行的起始,以表示命令是屬於一個規則。一條規則也可以有多條命令,每條命令佔一行(要以tab開頭)。至於可以使用哪些命令,這完全取決於你使用的os和shell。=""        ="" 當執行make時,它會找到第一條規則。然後,make就會檢查依賴和目標之間的關係。如果目標比依賴舊,就執行規則,以更新目標。執行完規則就結束。如何判定目標和依賴的新舊呢?如果目標(檔案)不存在,目標的時間就為0;如果目標(檔案存在),目標的時間就為檔案的修改時間。如果依賴項是一條規則,就執行依賴的規則(這裡是一個遞迴),然後依賴的時間就是當前最新時間;如果是一個存在的檔案,就為檔案的修改時間,否則就報錯。之後,就可以比較目標和依賴之間的關係。不過,有一點特殊的是,在沒有依賴項時,依賴的時間為1。="" 在這個例子中,make先找到規則“all”,發現目標不存在,所以目標的時間為0;然後在尋找依賴“a1”,結果“a1”不存在;於是,執行規則“a1”。“a1”不存在,所以它的時間為0,而“a1”沒有依賴,它的依賴時間為1;1>0,所以,執行規則“a1”。然後返回規則“all”,再檢查依賴“a2”。“a2”執行過程同“a1”。這時,“all”的目標時間為0,依賴時間為最新時間。於是,執行規則“all”的命令。="" 當然,大家也可以指定一條規則讓make執行,比如:make  ="" a1這個命令就是告訴make程式不去找第一條規則,而是規則“a1”來執行。並且我們還可以一次執行多條規則,比如:執行make  ="" a1  ="" a2就會連續執行“a1”、“a2”兩條規則。  ="" p><p>     ="" ok,雖然講得很混亂,但也費了我半天的力氣。大家應該有一點瞭解make規則的執行過程了吧。  ="=============================================

依賴的基本寫法如下:" target:dependence=""          ="" command<="" target可以是檔案名稱。dependence可以是其它的target名或檔案名稱。command就是作業系統所啟動並執行命令列。  ="" 變數  =""      ="" 一個make規則檔案有這些內容就已經基本可以工作了。可是,當我們在編譯一個程式時,如果有些內容要反覆用到,每次都要寫一長串的話,是很麻煩的。於是,make就引入了宏這個概念(其實也可以看成簡單的指令碼語言)。  ="" 宏變數的定義如下:  ="" var1  ="  " macro  ="" demo!  ="" var1就是變數名,它的值就是“this  ="" demo!”  ="" 如果我們要使用這個變數的值,那隻有通過$這個運算子才行—$(var1)代表的就是“this  ="" demo!”。  ="" 如下makefile  ="" 3.      ="" $(var1)  ="" 結果輸出:  ="" 使用者在執行命令列時也可以定義宏變數。其形式如下:  ="" all  ="" var1="”this  " test”  ="" 執行結果為:  ="" test  ="" 我們不僅可以使用自訂變數,還可以通過這種方式使用系統內容變數。這樣可以大大方便我們建議靈活的規則。如下makefile  ="" 2.      ="" $(windir)  ="" c:\windows="" (注意:makefile中的變數是大小寫敏感的)  ="=========================================

下面介紹makefile檔案的一些內建變數:

==========================================" [email protected]代表規則中的目標名(也就是規則名)。  ="" $<代表規則中的依賴項目。注意,它只代表規則所有依賴項目中的第一項!  ="" 其它還有:  ="" $^代表規則中所有的依賴項目。  ="" $?代表規則中時間新於目標的依賴項目。  ="" 不僅如此,還可以給這些特殊的變數加一些限制。  ="" 如:  ="" 在規則  ="" debug="" out.exe  ="" :  ="" out.obj  ="" 中,[email protected]代表debug="" out.exe,而$(@d)代表目錄名debug,$(@f)代表檔案名稱out.exe。其它如$(<d)、$(<f)、$(^d)、$(^f)、$(?d)、$(?f)與此類似。  ="============================================

舉個例子說明,下面是原始makefile檔案內容:

==============================================" myprog="" foo.o="" bar.o=""     ="" gcc="" -o="" foo.c="" foo.h="" bar.h="" -c="" bar.c="" objs="foo.o" cc="gcc" cflags="-Wall" -g="" $(objs)="" $(cc)="" $^="" [email protected]="" $(cflags)="" $<-o="">

windows 下使用makefile(二)---- 編譯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.