日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

nmake命令(windows下的makefile)

 量子記憶 2020-02-24

1. 如果已經(jīng)有vc6的dsp工程,可直接導(dǎo)出nmake腳本文件(.mak)

    “Project - Export Makefile...”

nmake -f nMakeTest.mak CFG="nMakeTest - Win32 Debug"

nmake -f nMakeTest.mak CFG="nMakeTest - Win32 Debug" all

nmake -f nMakeTest.mak CFG="nMakeTest - Win32 Release" clean

     注:如果未指定/F選項(xiàng),則使用當(dāng)前目錄下的名為makefile的文件

    【nmake /?】  獲取更多幫助!  vc6:【D:\program files\Microsoft Visual Studio\VC98\Bin】

                                             vs2008:【D:\program files\Microsoft Visual Studio 9.0\VC\bin】

     為了能正確地使用命令行工具及vc6或vs2008下的函數(shù)庫(kù),需要對(duì)一些環(huán)境變量進(jìn)行設(shè)置,最快捷地方式是通過(guò)如下方式打開(kāi)命令行窗口(以vs2008為例):

     

2. vs的c++工程沒(méi)有提供導(dǎo)出nmake腳本文件的功能,我們只有借助工具或手動(dòng)編寫(xiě)nmake腳本文件了

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3. rc.exe 【將.rc資源文本轉(zhuǎn)變成.res二進(jìn)制文件】  

所在路徑:C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\rc.exe

/l 0x804  // 默認(rèn)語(yǔ)言ID(十六進(jìn)制數(shù)表示)  0x804:簡(jiǎn)體中文  0x409:美國(guó)  更多...

/fo"nMakeTest.res"  // 指定rc文件輸出的res名稱(chēng)

例:rc.exe /l 0x804 /fo"nMakeTest.res" /d "_DEBUG" /d "_AFXDLL" “nMakeTest.rc”

4. cl.exe 常見(jiàn)選項(xiàng) 【將.c,.cpp,.cxx編譯成obj文件】  更多...

vs2008版本所在路徑:D:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\cl.exe

命令行長(zhǎng)度說(shuō)明

windows上整個(gè)命令行的長(zhǎng)度不能超過(guò)260個(gè)字符,然而編譯命令行往往會(huì)超過(guò)這個(gè)限制,微軟提供的解決方案是:將命令行參數(shù)寫(xiě)入一個(gè)response文件,然后將其傳入編譯器。

不過(guò)要注意的是:response文件仍然有32KB的限制。

如:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe" @"C:\UE4_15_0_Release\Build\Win64\PhysXVehicles.generated.cpp.obj.response"

/nologo   // 不打印版權(quán)申明信息

/I "../include"    // 添加頭文件查找路徑(如果路徑中帶有空格,一定要用引號(hào)括起來(lái))

/DWIN32  // 預(yù)編譯宏定義(win32程序)

/D_CONSOLE  // 預(yù)編譯宏定義(控制臺(tái)程序)

/D "_DEBUG"  // 預(yù)編譯宏定義(Debug版本)

/D_CRT_SECURE_NO_DEPRECATE  // 預(yù)編譯宏定義(關(guān)閉C4996警告。使用strcpy、strcat等不安全函數(shù)時(shí)會(huì)報(bào)C4996警告)

/D_CRT_NONSTDC_NO_DEPRECATE  // 預(yù)編譯宏定義(關(guān)閉C4996警告。使用strcpy、strcat等不安全函數(shù)時(shí)會(huì)報(bào)C4996警告)

/DLIB_VER=0x2000 // 預(yù)編譯自定義宏LIB_VER為0x2000  等價(jià)于#define LIB_VER 0x2000

/Od  // 優(yōu)化選項(xiàng):帶入Debug信息

/O2  // 優(yōu)化選項(xiàng):最快速度

/O1  // 優(yōu)化選項(xiàng):最小尺寸

/Oy  // 啟用幀指針省略【Frame pointer omission (FPO)】?jī)?yōu)化

       // FPO是一種二進(jìn)制程序代碼優(yōu)化方法,它壓縮或者省略了在棧上為該函數(shù)創(chuàng)建框架指針的過(guò)程。這個(gè)選項(xiàng)加速了函數(shù)調(diào)用,因?yàn)椴恍枰⒑鸵瞥蚣苤羔槪‥SP,EBP)了。

       // 同時(shí),它還解放出了EBP寄存器,用來(lái)存儲(chǔ)使用頻率較高的變量。只在Intel CPU的架構(gòu)上才有這種優(yōu)化。

       // 在Vista之前的os中,開(kāi)啟編譯優(yōu)化就會(huì)默認(rèn)進(jìn)行FPO優(yōu)化,在Vista以后默認(rèn)就沒(méi)有FPO優(yōu)化了,它所帶來(lái)的優(yōu)化效果比起它所帶來(lái)的函數(shù)調(diào)用堆?;厮莸膯?wèn)題可以忽略。

/W3  // 設(shè)置3級(jí)警告級(jí)別

/WX     // 將Warining視為error

/wd4326  // 隱藏編譯器警告C4326

/we4457 // 將編譯器警告C4457視為錯(cuò)誤

/Fp"nMakeTest.pch"  // 指定預(yù)編譯文件名

/Yu"stdafx.h"   // 在生成期間使用預(yù)編譯頭文件

預(yù)編譯頭文件技術(shù),就是把一個(gè)工程(Project)中常用的一些頭文件(如標(biāo)準(zhǔn)頭文件Windows.h、Afxwin.h等,
也可以是自己定義的頭文件)包含在stdafx.h中,并對(duì)stdafx.cpp載體編譯單元(其中#include stdafx.h)預(yù)先編譯(在所有的.cpp文件編譯之前進(jìn)行編譯),
得到編譯結(jié)果.pch文件(默認(rèn)名稱(chēng)為ProjectName.pch),后期該工程在編譯其它.cpp文件時(shí)不再編譯stdafx.h中的內(nèi)容(即使include了它),僅僅使用預(yù)編譯的結(jié)果。

有2點(diǎn)需要注意:
1. 每個(gè)cpp的開(kāi)頭都必須#include "stdafx.h"
2. 由于預(yù)編譯頭文件編譯很耗時(shí),一旦改動(dòng)就會(huì)引起整個(gè)工程重新編譯,因此盡量把不易改動(dòng)的代碼包含其中

/FI "myheader.h" // 在每個(gè)源文件的第一行上的#include該文件

/Fd"vcpdb/testpdb" // 會(huì)將vc輔助編譯的idb及pdb文件(見(jiàn)下面的/Gm選項(xiàng))輸入到vcpdb目錄中,

                               并重命名為testpdb.idb與testpdb.pdb(這里的pdb為project database文件,用于存工程的數(shù)據(jù)庫(kù)信息)

/Fo"objFiles" // 將obj文件輸出到objFiles目錄中

/c   // 編譯但不鏈接

/feMyTest  // 編譯后,輸出MyTest.exe可執(zhí)行文件

 

/EHsc   // 啟用"C++異常(Exceptions)"的stack unwind,編譯器會(huì)插入一些代碼保證發(fā)生異常后所有try塊中的對(duì)象都能調(diào)用析構(gòu)函數(shù)來(lái)做清理工作

/EHa  // 該參數(shù)能讓C++ try catch,不但能捕捉標(biāo)準(zhǔn)的C++的異常,還能用catch(...)捕獲SEH的異常  如:整數(shù)除0,access violation (AV)等

 

注:將"Enable C++ Exceptions"設(shè)置為No,并不是在代碼中不能使用c++異常。

      c++異常拋出能夠正確地被catch捕獲,只是沒(méi)有了stack unwind,try塊中對(duì)象不會(huì)調(diào)用析構(gòu)函數(shù),可能會(huì)引發(fā)泄漏

 

/LD   // 創(chuàng)建動(dòng)態(tài)鏈接庫(kù) 
/LDd   // 創(chuàng)建調(diào)試動(dòng)態(tài)鏈接庫(kù)

/ML   // 使用 libc.lib 創(chuàng)建單線程可執(zhí)行文件 
/MLd    // 使用 libcd.lib 創(chuàng)建調(diào)試單線程可執(zhí)行文件 
/MT    // 使用 libcmt.lib 創(chuàng)建多線程可執(zhí)行文件 
/MTd    // 使用 libcmtd.lib 創(chuàng)建調(diào)試多線程可執(zhí)行文件 
/MD    // 使用 msvcrt.lib/msvcrt.dll 創(chuàng)建多線程可執(zhí)行文件
/MDd    // 使用 msvcrtd.lib/msvcrtd.dll創(chuàng)建調(diào)試多線程可執(zhí)行文件

/Z7   //生成與 C7.0兼容的調(diào)試信息 
/Zd   //生成行號(hào) 
/Zi    //生成完整的調(diào)試信息

/Za  // 禁用語(yǔ)言擴(kuò)展(不支持ANSI C89 及 C++11) --使用該參數(shù)時(shí),編譯器會(huì)自動(dòng)定義__STDC__宏

/Ze  // 啟用語(yǔ)言擴(kuò)展(默認(rèn))

/Zl  // ZL 非ZI; 告訴編譯器從.obj文件中移除默認(rèn)C庫(kù)鏈接指令(注:該鏈接指令會(huì)被傳給連接器   形如:/DEFAULTLIB:'LIBCMT')

/Gm     // 啟用最小重新生成 

          編譯器在.idb文件中存儲(chǔ)源文件和類(lèi)定義之間的依賴(lài)關(guān)系。
          使用.idb 文件的信息來(lái)確定是否需要編譯某個(gè)源文件。
          而不是該源文件只要包含了被修改的.h文件,就必須重新編譯。

/GR  // 啟用運(yùn)行時(shí)類(lèi)型識(shí)別信息(RTTI,Run-Time Type Information)  編譯器會(huì)在exe或dll文件中增加一個(gè).rdata的段來(lái)存放變量的類(lèi)型信息

        例:int a;   bool b = (typeid(a)==typeid(int)); // b為true

/GR-  // 關(guān)閉運(yùn)行時(shí)類(lèi)型識(shí)別信息,exe或dll會(huì)更小

/Zp8  // 結(jié)構(gòu)體、類(lèi)等復(fù)合類(lèi)型的數(shù)據(jù)成員以8字節(jié)進(jìn)行內(nèi)存對(duì)齊

/bigobj  // 提高obj文件中Section數(shù)的上限   65,536 (2 ^16) --> 4294967296(2 ^32)  注:vs2005及以上的編譯器才支持

/RTCs  // 啟用棧幀運(yùn)行時(shí)錯(cuò)誤檢查。主要體現(xiàn)在:1. 當(dāng)使用的變量尚未初始化時(shí)進(jìn)行報(bào)告   2.檢測(cè)局部變量(如數(shù)組)的溢出和不足   3. 檢測(cè)ESP損壞,如檢測(cè)調(diào)用約定不匹配可能導(dǎo)致ESP損壞

/Ob2 // 啟用函數(shù)內(nèi)聯(lián)

 

/link  // 將/link后指定的選項(xiàng)傳遞給link.exe

// 默認(rèn)情況下,cl.exe編譯完后,會(huì)自動(dòng)調(diào)用link.exe進(jìn)行連接,
// 所以直接用cl.exe編譯帶main函數(shù)的.c或.cpp后,會(huì)生成obj與exe文件。

例:cl /c test1.cpp test2.cpp  // 編譯test1.cpp,test2.cpp

例:cl *.cpp /MD /c /I"G:\Visual C++\VC98\PlatformSDK\Include"

5. link.exe常見(jiàn)選項(xiàng)  【將obj、lib、res鏈接成dll或exe等可執(zhí)行文件】

vs2008版本所在路徑:D:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\link.exe

/dll  // 輸出dll文件

-lib  // 生成lib靜態(tài)庫(kù)文件  例:link -lib *.obj /out:test.lib 

/libpath:"..\PublicSDK\lib" // 指定外部lib查找路徑(路徑中不能帶有空格,否則鏈接時(shí)會(huì)報(bào)LNK1181的錯(cuò)誤)

/subsystem:windows[console]   // 指定子系統(tǒng)

/machine 指定目標(biāo)平臺(tái){AM33|ARM|EBC|IA64|M32R|MIPS|SH3|SH3DSP|SH4|SH5|THUMB|X86|X64},等

/NODEFAULTLIB:libcd.lib  // 鏈接時(shí),忽略libcd.lib庫(kù)

/debug  // 生成調(diào)試信息

/export:myAdd=_Add,@1   // 導(dǎo)出extern "C" Add函數(shù),并將符號(hào)名修改為myAdd,同時(shí)將導(dǎo)出序號(hào)設(shè)為1(一種dll動(dòng)態(tài)庫(kù)導(dǎo)出符號(hào)的方法)

/export:_g_isTest,@2   // 導(dǎo)出extern "C" g_isTest變量,并將導(dǎo)出序號(hào)設(shè)為2(一種dll動(dòng)態(tài)庫(kù)導(dǎo)出符號(hào)的方法)

/def:"nMakeTest.def" // 模塊導(dǎo)出文件(另外一種dll動(dòng)態(tài)庫(kù)導(dǎo)出符號(hào)的方法)

注1:def文件名不要求與dll文件名或工程名一致
注2:一個(gè)dll工程最多只允許使用一個(gè)def文件
注3:vc:只需將def文件添加到工程中即可
注4:vs2008:項(xiàng)目 - 屬性 - 連接器 - 輸入 - 模塊定義文件,填入def文件名(def文件要放在當(dāng)前工程目錄之下,def文件可不添加到工程中)

;nMakeTest.lib 導(dǎo)出DLL函數(shù)
;作者:kekec
LIBRARY nMakeTest.def
EXPORTS
Add @ 1
g_isTest @ 2

注:還可以在代碼中使用__declspec(dllexport)進(jìn)行符號(hào)的導(dǎo)出

#ifdef WIN32DLL_EXPORTS
#define WIN32DLL_API __declspec(dllexport)
#else
#define WIN32DLL_API __declspec(dllimport)
#endif

/************** export.c ***************/ 
#ifdef __cplusplus
extern "C"
{
#endif
    WIN32DLL_API int __stdcall Add(int a, int b)
    {
        return (a + b);
    }

    WIN32DLL_API int g_isTest = 0;
#ifdef __cplusplus
}
#endif

/pdb:"nMakeTest.pdb"  // 重命名生成的pdb文件(Program Debug Database),保存調(diào)試符號(hào)等信息

/map:"nMakeTest.map" // 重命名生成的map文件

/out:"nMakeTest.exe" // 重命名生成的exe文件

/implib:"test.lib"  // 生成名為test.lib的導(dǎo)出庫(kù)

/stack:0x300000  // 設(shè)置線程棧Reserve內(nèi)存大小為3MB  windows缺省是1MB   -- 格式:/STACK:reserve[,commit]

/stack:0x500000,0x200000  // 設(shè)置線程棧Reserve內(nèi)存大小為5MB,Commit內(nèi)存大小為2MB   windows缺省是1MB   -- 格式:/STACK:reserve[,commit]

/entry:_DllMainCRTStartup@12   // 指定_DllMainCRTStartup函數(shù)dll的起始地址

/release  // 生成checksum

/incremental:yes   // 開(kāi)啟增量鏈接

          incremental開(kāi)關(guān)默認(rèn)是開(kāi)啟的。
          開(kāi)啟增量鏈接產(chǎn)生的exe或dll文件的size要大一些。
          因?yàn)橛写a和數(shù)據(jù)的填充,增量鏈接的exe或dll文件會(huì)包含跳轉(zhuǎn)trunk來(lái)處理函數(shù)重定位到新地址。 
          MSDN上明確指出:為確保最終發(fā)布版本不包含填充或者trunk,請(qǐng)關(guān)閉增量鏈接。

例:link gdiplus.lib /subsystem:windows /out:test.exe file1.obj file2.lib file3.res // 生成名為test.exe的windows可執(zhí)行程序
例:link gdiplus.lib /subsystem:console /out:test.exe *.obj file2.lib file3.res // 生成名為test.exe的控制臺(tái)可執(zhí)行程序
例:link gdiplus.lib /subsytem:windows /dll /out:test.dll /implib:test.lib /def:test.def *.obj file2.lib file3.res // 生成名為test.dll動(dòng)態(tài)庫(kù)

例:link *.obj rc.res /LIBPATH:"G:\Visual C++\lib" /SUBSYSTEM:WINDOWS /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OpenGL32.Lib

例:"D:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/link.exe"  /MANIFEST:NO /NOLOGO /DEBUG /errorReport:prompt /MACHINE:x86 /SUBSYSTEM:WINDOWS /FIXED:No /LARGEADDRESSAWARE /NXCOMPAT /STACK:5000000,5000000 /SAFESEH /DEF:UnrealEngine3.def /DELAY:UNLOAD /RELEASE /OPT:REF /OPT:ICF /INCREMENTAL:NO /DELAYLOAD:"dxgi.dll" /DELAYLOAD:"d3d10.dll" /LIBPATH:"../External/zlib/Lib" /LIBPATH:"D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\/Lib/x86" /NODEFAULTLIB:"MSVCRTD" /NODEFAULTLIB:"MSVCPRTD" /NODEFAULTLIB:"LIBC" /NODEFAULTLIB:"LIBCMT" /NODEFAULTLIB:"LIBCPMT" /NODEFAULTLIB:"LIBCP" /NODEFAULTLIB:"LIBCD" /NODEFAULTLIB:"LIBCMTD" /NODEFAULTLIB:"LIBCPMTD" /NODEFAULTLIB:"LIBCPD" @"g:\svn\MyGame\Binaries\Win32\MyGameRelease.exe.response" /OUT:"g:\svn\MyGame\Binaries\Win32\MyGameRelease.exe" /IMPLIB:"g:\svn\MyGame\Binaries\Win32\MyGameRelease.lib" /PDB:"g:\svn\MyGame\Binaries\Win32\MyGameRelease.pdb" /CLRTHREADATTRIBUTE:STA /FILEALIGN:0x1000

6. nmake指令說(shuō)明

(1) 符號(hào)說(shuō)明

     #   // 注釋符(命令所在行不能使用注釋符,命令應(yīng)該與注釋都獨(dú)立使用一行進(jìn)行書(shū)寫(xiě);如:erase nMakeTest.obj  # 刪除nMakeTest.obj文件【非法】)

     ^#abc  // 表示#abc這個(gè)字符串

     \  // 連接符,用于將兩行合并為一行;在宏中,分多行寫(xiě)時(shí),一定要用"\"進(jìn)行連接

     %  // 文件說(shuō)明符,表示其后的字符串為一文件名

---------------------

若文件名為 c:\prog.exe
%s 將為 c:\prog.exe 
%:F 將為 c:\prog.exe
%:dF 將為 c
%:pF 將為 c:\
%:fF 將為 prog
%:eF 將為 exe

---------------------

     @  // 命令修飾符;防止修飾的命令的結(jié)果,被打印出來(lái)

      !       // 命令修飾符

  $  // 宏引用符

      :  // 依賴(lài)符號(hào)

  ?【*】  // 通配符支持  

++++++++++++++++++++++++++++++++++++

     $@   // 表示所有目標(biāo)全名(路徑+文件名稱(chēng)+擴(kuò)展名)的挨個(gè)值

     $$@  // 與$@用法含義一致,但僅在作為依賴(lài)項(xiàng)中的依賴(lài)項(xiàng)時(shí)有效

     $<   // 表示所有依賴(lài)目標(biāo)的挨個(gè)值,僅在推理規(guī)則的命令中有效

     $^   // 表示所有依賴(lài)目標(biāo)的集合,以空格分隔,若有重復(fù),會(huì)被去重;

     $+   // 與$^含義一致,只是不進(jìn)行去重處理。
     $?    // 表示所有比目標(biāo)心的依賴(lài)目標(biāo)的集合,以空格分隔

     $*    // 當(dāng)前目標(biāo)的路徑和文件名稱(chēng),沒(méi)有文件擴(kuò)展名
     $**  // 當(dāng)前目標(biāo)的所有依賴(lài)項(xiàng)

----------------------------

修飾符   說(shuō)明  
D         驅(qū)動(dòng)器和目錄  
B         文件名稱(chēng)  
F         文件名稱(chēng)和擴(kuò)展名  
R         驅(qū)動(dòng)器、目錄和文件名稱(chēng)

----------------------------

(2) 長(zhǎng)文件名用雙引號(hào)引起來(lái)

  例:ALL : nMakeTest.dll  // 文件名較短時(shí),可不需要引號(hào)
  例:ALL : "$(OUTDIR)\nMakeTest.exe" // 文件名較長(zhǎng)時(shí),特別是路徑中有空格的情況,一定要用引號(hào)

(3) 預(yù)定義規(guī)則

.c.obj    // 默認(rèn)操作:cl /c $*.c

也可對(duì)默認(rèn)操作顯示地重寫(xiě):

 

.c.obj:
    cl /c /Ox /DWIN32 $<

 

(4) 包含文件

!INCLUDE nmake.opt

include makefile.mak

(5) 條件判斷 - 01

!IF "$(CFG)" == ""
CFG=nMakeTest - Win32 Debug
!MESSAGE No configuration specified. Defaulting to nMakeTest - Win32 Debug.
!ELSE
!MESSAGE Be specified.
!ENDIF

(6) 條件判斷 - 02  【!IFNDEF   !IFDEF】

!IFNDEF PRIVATE_RUNTIMEMODE_DEBUG
RUNTIMEMODE_DEBUG = /MDd 
!ELSE
RUNTIMEMODE_DEBUG = $(PRIVATE_RUNTIMEMODE_DEBUG)
!ENDIF

(7) 輸出消息日志

!MESSAGE Invalid configuration "$(CFG)" specified.

(8) 描述塊 - makefile的核心 【注:在依賴(lài)項(xiàng)(或規(guī)則)和命令塊之間不能出現(xiàn)空行,commands之前為一個(gè)tab字符,多條command之間用;分割】

     只要dependences中任意一個(gè)文件比targets新,就執(zhí)行commands命令

targets... : dependences...
  commands...

(9) ALL / CLEAN

OUTDIR=.\Release
INTDIR=.\Release
ALL : "$(OUTDIR)\nMakeTest.exe"
CLEAN :
  -@erase "$(INTDIR)\nMakeTest.obj"
  -@erase "$(INTDIR)\nMakeTest.pch"
  -@erase "$(INTDIR)\nMakeTest.res"
  -@erase "$(INTDIR)\nMakeTestDlg.obj"
  -@erase "$(INTDIR)\StdAfx.obj"
  -@erase "$(INTDIR)\vc60.idb"
  -@erase "$(OUTDIR)\nMakeTest.exe"
  -@erase "$(OUTDIR)\nMakeTest.map"
"$(OUTDIR)" :
  if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

(10) 編譯

CPP=cl.exe
CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)\nMakeTest.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
.c{$(INTDIR)}.obj::
  $(CPP) @<<
  $(CPP_PROJ) $< 
<<
.cpp{$(INTDIR)}.obj::
  $(CPP) @<<
  $(CPP_PROJ) $< 
<<
.cxx{$(INTDIR)}.obj::
  $(CPP) @<<
  $(CPP_PROJ) $< 
<<

(11) 鏈接

LINK32=link.exe
LINK32_FLAGS=/nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\nMakeTest.pdb" /map:"$(INTDIR)\nMakeTest.map" /machine:I386 /out:"$(OUTDIR)\nMakeTest.exe" 
LINK32_OBJS= \
  "$(INTDIR)\nMakeTest.obj" \
  "$(INTDIR)\nMakeTestDlg.obj" \
  "$(INTDIR)\StdAfx.obj" \
  "$(INTDIR)\nMakeTest.res"
"$(OUTDIR)\nMakeTest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
   $(LINK32) @<<
  $(LINK32_FLAGS) $(LINK32_OBJS)
<<

(12) 文件依賴(lài)

SOURCE=.\nMakeTest.cpp
"$(INTDIR)\nMakeTest.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\nMakeTest.pch"
SOURCE=.\nMakeTest.rc
"$(INTDIR)\nMakeTest.res" : $(SOURCE) "$(INTDIR)"
$(RSC) $(RSC_PROJ) $(SOURCE)

(13) 預(yù)編譯文件

SOURCE=.\StdAfx.cpp
!IF "$(CFG)" == "nMakeTest - Win32 Release"
CPP_SWITCHES=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)\nMakeTest.pch" /Yc"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
"$(INTDIR)\StdAfx.obj" "$(INTDIR)\nMakeTest.pch" : $(SOURCE) "$(INTDIR)"
  $(CPP) @<<
 $(CPP_SWITCHES) $(SOURCE)
<<
!ELSEIF "$(CFG)" == "nMakeTest - Win32 Debug"
CPP_SWITCHES=/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)\nMakeTest.pch" /Yc"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c 
"$(INTDIR)\StdAfx.obj" "$(INTDIR)\nMakeTest.pch" : $(SOURCE) "$(INTDIR)"
  $(CPP) @<<
 $(CPP_SWITCHES) $(SOURCE)
<<
!ENDIF

# 參考

1. http://msdn.microsoft.com/zh-cn/library/dd9y37ha(v=vs.80).aspx
2. http:///cgi/wiki?UsingNmake 
3. http://zh./wiki/Make

4. cl.exe link.exe用法詳解

5. http://blog./2008/09/replacement_of_ide_1.html
6. http://blog./2008/09/replacement_of_ide_2
7. http://blog./2008/09/replacement_of_ide_3
8. http://blog./2008/09/replacement_of_ide_4

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多