舉幾個(gè)例子說(shuō)明 VS編譯器(cl.exe)命令行編譯
CL.exe 的命令行編譯斷斷續(xù)續(xù)接觸了幾次,每次都忘,每次都重新查。每次都搞不清楚語(yǔ)法,尤其是傳給linker的參數(shù)。因?yàn)榫W(wǎng)上所有的文章都是一樣的,都是詳細(xì)的參數(shù)列表,都是沒(méi)有實(shí)例。為了和大眾保持一致,我在下面也copy一個(gè)詳細(xì)的參數(shù)列表---只是在前面加幾個(gè)實(shí)例
?
cl.exe test.cpp /EHsc /I"C:/OpenCV2.0/include/opencv/" cv200.lib highgui200.lib?cxcore200.lib?/link /LIBPATH:"C:/OpenCV2.0/vs2008/lib"
?
/LIBPATH小寫(xiě)也可以/libpath
?
網(wǎng)上找到的“經(jīng)典用法”
cl *.cpp /G7 /MD /Ox /Ot /W3 /c /EHsc /I"G:/Visual C++/VC98/PlatformSDK/Include"
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
?
MFC 開(kāi)發(fā)如下:
編譯源代碼:
cl *.cpp /Ox /Ot /G7 /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /EHsc /MD /arch:SSE2 /W3 /c
資源編譯 :
rc /l 0x804 winmfc.rc
鏈接 :
link *.obj WinMFC.res /out:WinMFC.exe /OPT:NOWIN98 /SUBSYSTEM:WINDOWS /MACHINE:X86
?
===================================
?
CL?? 命令行使用下列語(yǔ)法:?????
CL?? [option...]?? file...?? [option?? |?? file]...?? [lib...]?? [@command-file]?? [/link?? link-opt...]???
下表說(shuō)明CL?? 命令的輸入項(xiàng)意義
????
option?? ??一個(gè)或多個(gè)?? CL?? 選項(xiàng)。請(qǐng)注意,所有選項(xiàng)都應(yīng)用于所有指定的源文件。選項(xiàng)是由一個(gè)正斜杠?? (/)?? 或一個(gè)短劃線?? (–)?? 指定的。如果某個(gè)選項(xiàng)帶有參數(shù),則該選項(xiàng)的說(shuō)明指定在選項(xiàng)和參數(shù)之間是否允許有空格。選項(xiàng)名(/HELP?? 選項(xiàng)除外)區(qū)分大小寫(xiě)。有關(guān)更多信息,請(qǐng)參閱?? CL?? 選項(xiàng)的順序。??
????
file? ??一個(gè)或多個(gè)源文件、.obj?? 文件或庫(kù)的名稱。CL?? 編譯源文件并將?? .obj?? 文件和庫(kù)的名稱傳遞給鏈接器。有關(guān)更多信息,請(qǐng)參閱?? CL?? 文件名語(yǔ)法。
lib?? ??一個(gè)或多個(gè)庫(kù)名。CL?? 將這些名稱傳遞給鏈接器。?????
????
command-file?? 包含多個(gè)選項(xiàng)和文件名的文件。有關(guān)更多信息,請(qǐng)參閱?? CL?? 命令文件。?????
????
link-opt?? 一個(gè)或多個(gè)鏈接器選項(xiàng)。CL?? 將這些選項(xiàng)傳遞給鏈接器。
您可以指定任意數(shù)目的選項(xiàng)、文件名和庫(kù)名,條件是命令行上的字符數(shù)不超過(guò)?? 1024,該限制是操作系統(tǒng)指定的。?
?
?
編譯器
注意,所有編譯器選項(xiàng)都區(qū)分大小寫(xiě)。
若要編譯但不鏈接,請(qǐng)使用?? /c。
使用?? NMAKE?? 生成輸出文件。?????
使用?? BSCMAKE?? 支持類瀏覽。
以下是一個(gè)完整的編譯器選項(xiàng)分類列表。
?
一、優(yōu)化?????
? 選項(xiàng)???????????? 作用?????
? /O1?? ?創(chuàng)建小代碼?????
? /O2?? ?創(chuàng)建快速代碼?????
? /Oa?? ?假設(shè)沒(méi)有別名?????
? /Ob?? ?控制內(nèi)聯(lián)展開(kāi)?????
? /Od?? ?禁用優(yōu)化?????
? /Og?? ?使用全局優(yōu)化?????
? /Oi?? ?生成內(nèi)部函數(shù)?????
? /Op?? ?改善浮點(diǎn)數(shù)一致性?????
? /Os?? ?代碼大小優(yōu)先?????
? /Ot?? ?代碼速度優(yōu)先?????
? /Ow?? ?假定在函數(shù)調(diào)用中使用別名?????
? /Ox?? ?使用最大優(yōu)化?? (/Ob1gity?? /Gs)?????
? /Oy?? ?省略框架指針
?
二、代碼生成?????
? 選項(xiàng)?? ??作用?????
? /clr?? ?啟用C++ 的托管擴(kuò)展并產(chǎn)生在公共語(yǔ)言運(yùn)行庫(kù)上運(yùn)行的輸出文件?????
? /EH?? ?指定異常處理模型?????
? /G3?? ?優(yōu)化代碼以優(yōu)選386處理器。在Visual C++ 5.0中已經(jīng)停用,編譯器將忽略此選項(xiàng)?????
? /G4?? ?優(yōu)化代碼以優(yōu)選486處理器。在Visual C++ 5.0中已經(jīng)停用,編譯器將忽略此選項(xiàng)?????
? /G5?? ?優(yōu)化代碼以優(yōu)選Pentium?????
? /GB?? ?與/G6等效;將 _M_IX86的值設(shè)置為600?????
? /Gd?? ?使用__cdecl 調(diào)用約定?????
? /Ge?? ?激活堆棧探測(cè)?????
? /GF???
? /GF?? ?啟用字符串池?????
? /GH?? ?調(diào)用掛鉤函數(shù)_penter?????
? /GH? ?調(diào)用掛鉤函數(shù)_pexit?????
? /GL?? ?啟用全程序優(yōu)化?????
? /Gm?? ?啟用最小重新生成?????
? /Gr?? ?啟用運(yùn)行時(shí)類型信息(RTTI)?????
? /Gr?? ?使用 __fastcall 調(diào)用約定?????
? /GS?? ?控制堆棧探測(cè)?????
? /GT?? ?支持使用靜態(tài)線程本地存儲(chǔ)區(qū)分配的數(shù)據(jù)的纖程安全?????
? /GX?? ?啟用同步異常處理?????
? /Gy?? ?啟用函數(shù)級(jí)鏈接?????
? /GZ?? ?使用?? __stdcall?? 調(diào)用約定?????
? /MD?? ?使用?? MSVCRT.lib?? 創(chuàng)建多線程?? DLL?????
? /MDd?? ?使用?? MSVCRTD.lib?? 創(chuàng)建調(diào)試多線程?? DLL?????
? /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í)行文件
?
三、輸出文件?????
? 選項(xiàng)?? ??作用?????
? /FA?? ?創(chuàng)建列表文件
? /FA?? ?設(shè)置列表文件名??????????
? /Fd?? ?重命名程序數(shù)據(jù)庫(kù)文件?????
? /Fe?? ?重命名可執(zhí)行文件?????
? /Fm? ?創(chuàng)建映射文件?????
? /Fo?? ?創(chuàng)建對(duì)象文件?????
? /Fp?? ?指定預(yù)編譯頭文件名?????
? /FR???
? /FR?? ?生成瀏覽器文件?????
? /Fx?? ?將插入的代碼與源文件合并
?
四、調(diào)試???????
? 選項(xiàng)?? ??作用?????
? /GS?? ?緩沖區(qū)安全檢查?????
? /GZ?? ?與?? /RTC1?? 相同?????
? /RTC?? ?啟用運(yùn)行時(shí)錯(cuò)誤檢查?????
? /Wp64?? 檢測(cè)?? 64?? 位可移植性問(wèn)題?????
? /Yd?? ?將完整的調(diào)試信息放在所有對(duì)象文件中?????
? /Yl?? ?創(chuàng)建調(diào)試庫(kù)時(shí)插入?? PCH?? 引用?????
? /Z7?? ?生成與?? C?? 7.0?? 兼容的調(diào)試信息?????
? /Zd?? ?生成行號(hào)?????
? /Zi?? ?生成完整的調(diào)試信息
?
五、預(yù)處理器???????
? 選項(xiàng)?? ??作用?????
? /AI?? ?指定在解析傳遞到#using?? 指令的文件引用時(shí)搜索的目錄?????
? /c?? ??在預(yù)處理期間保留注釋?????
? /D?? ?定義常數(shù)和宏?????
? /E?? ?將預(yù)處理器輸出復(fù)制到標(biāo)準(zhǔn)輸出?????
? /EP?? ?將預(yù)處理器輸出復(fù)制到標(biāo)準(zhǔn)輸出?????
? /Fl?? ?預(yù)處理指定的包含文件?????
? /FU?? ?強(qiáng)制使用文件名,就像它已被傳遞到#using?? 指令一樣?????
? /I?? ??在目錄中搜索包含文件?????
? /P?? ?將預(yù)處理器輸出寫(xiě)入文件?????
? /U?? ?移除預(yù)定義宏?????
? /U?? ?移除所有的預(yù)定義宏?????
? /X?? ?忽略標(biāo)準(zhǔn)包含目錄?????
? /ZI?? ?將調(diào)試信息包含在與“編輯并繼續(xù)”兼容的程序數(shù)據(jù)庫(kù)中
?
六、語(yǔ)言???????
? 選項(xiàng)?? ???作用?????
? /noBool?? ?取消?? C++?? bool、true?? 和?? false?? 關(guān)鍵字?????
? /vd?? ??取消或啟用隱藏的?? vtordisp?? 類成員?????
? /vmb?? ??對(duì)指向成員的指針使用最佳的基?????
? /vmg?? ??對(duì)指向成員的指針使用完全一般性?????
? /vmm?? ??聲明多重繼承?????
? /vms?? ??聲明單一繼承?????
? /vmv?? ??聲明虛擬繼承?????
? /Za?? ??禁用語(yǔ)言擴(kuò)展?????
? /Zc?? ??在?? /Ze?? 下指定標(biāo)準(zhǔn)行為?????
? /Ze?? ??啟用語(yǔ)言擴(kuò)展?????
? /Zg?? ??生成函數(shù)原型?????
? /Zl?? ??從?? .obj?? 文件中移除默認(rèn)庫(kù)名?????
? /Zpn?? ??封裝結(jié)構(gòu)成員?????
? /Zs?? ??只檢查語(yǔ)法
?
七、鏈接???????
? 選項(xiàng)?? ??作用?????
? /F?? ?設(shè)置堆棧大小?????
? /LD?? ?創(chuàng)建動(dòng)態(tài)鏈接庫(kù)?????
? /LDd?? ?創(chuàng)建調(diào)試動(dòng)態(tài)鏈接庫(kù)?????
? /link?? ?將指定的選項(xiàng)傳遞給?? LINK?????
? /MD?? ?使用?? MSVCRT.lib?? 編譯以創(chuàng)建多線程?? DLL?????
? /MDd?? ?使用?? MSVCRTD.lib?? 編譯以創(chuàng)建調(diào)試多線程?? DLL?????
? /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í)行文件
?
八、預(yù)編譯頭???????
? 選項(xiàng)?? ??作用?????
? /Y-?? ?忽略當(dāng)前生成中的所有其他預(yù)編譯頭編譯器選項(xiàng)?????
? /Yc?? ?創(chuàng)建預(yù)編譯頭文件?????
? /Yd?? ?將完整的調(diào)試信息放在所有對(duì)象文件中?????
? /Yu?? ?在生成期間使用預(yù)編譯頭文件?????
? /YX?? ?自動(dòng)處理預(yù)編譯頭
?
九、雜項(xiàng)???????
? 選項(xiàng)?? ??作用?????
? @?? ?指定響應(yīng)文件?????
? /??? ?列出編譯器選項(xiàng)?????
? /c?? ??編譯但不鏈接?????
? /H?? ?限制外部(公共)名稱的長(zhǎng)度?????
? /HELP?? ?列出編譯器選項(xiàng)?????
? /J?? ??更改默認(rèn)的?? char?? 類型?????
? /NOLOGO?? 取消顯示登錄版權(quán)標(biāo)志?????
? /QI0f?? ?確保?? Pentium?? 0F?? 指令沒(méi)有問(wèn)題?????
? /QIfdiv?? FDIV、FPREM、FPTAN?? 和?? FPATAN?? 指令有缺陷的?? Intel?? Pentium?? 微處理器的變通方法?????
? /QIfist?? 當(dāng)需要從浮點(diǎn)類型轉(zhuǎn)換為整型時(shí)取消?? Helper?? 函數(shù)?? _ftol?? 的調(diào)用????
? /showIncludes?? 在編譯期間顯示所有包含文件的列表?????
? /Tc???
? /Tc?? ?指定?? C?? 源文件?????
? /Tp???
? /Tp?? ?指定?? C++?? 源文件?????
? /V?? ?設(shè)置版本字符串?????
? /w?? ?設(shè)置警告等級(jí)?????
? /w?? ?禁用所有警告?????
? /Wall?? ?啟用所有警告,包括默認(rèn)情況下禁用的警告?????
? /WL?? ?在從命令行編譯?? C++?? 源代碼時(shí)啟用錯(cuò)誤信息和警告消息的單行診斷?????
? /Zm?? ?設(shè)置編譯器的內(nèi)存分配限制????
?
===================================
?
LINK 用法如下:
?
/ALIGN 指定每一節(jié)的對(duì)齊方式?
/ALIGN 選項(xiàng)指定程序線性地址空間中每一節(jié)的對(duì)齊方式。number 參數(shù)以字節(jié)為單位,并且必須是2 的冪。默認(rèn)值是 4K (4096)。如果對(duì)齊方式產(chǎn)生
無(wú)效的圖像,則鏈接器發(fā)出警告。除非正
在編寫(xiě)諸如設(shè)備驅(qū)動(dòng)程序的應(yīng)用程序,否則應(yīng)不需要修改對(duì)齊方式。
/DLL 生成 DLL?
/DRIVER 創(chuàng)建 Windows NT 核心模式驅(qū)動(dòng)程序?
/EXETYPE 生成虛擬設(shè)備驅(qū)動(dòng)程序?
/EXETYPE:DYNAMIC 創(chuàng)建動(dòng)態(tài)加載的虛擬設(shè)備驅(qū)動(dòng)程序。?
/EXETYPE:DEV386 創(chuàng)建靜態(tài)加載的虛擬設(shè)備驅(qū)動(dòng)程序。這是 /EXETYPE 的默認(rèn)值
/INCREMENTAL 控制增量鏈接?
/LARGEADDRESSAWARE 通知編譯器應(yīng)用程序支持大于 2 GB 的地址?
/LIBPATH 允許用戶重寫(xiě)環(huán)境庫(kù)路徑?
/LIBPATH:"e:/VC/LIB" /LIBPATH:"e:/DX/LIB"
/MACHINE 指定目標(biāo)平臺(tái)?
` /MACHINE:{AM33|ARM|EBC|IA64|M32R|MIPS|MIPS16|MIPSFPU|MIPSFPU16|
MIPSR41XX|SH3|SH3DSP|SH4|SH5|THUMB|X86| X64/*8.0版本*/}
/MACHINE:X86
/NOENTRY 創(chuàng)建純資源 DLL?
創(chuàng)建純資源 DLL 時(shí)要求 /NOENTRY 選項(xiàng)。
/OPT 控制 LINK 優(yōu)化
如果生成僅運(yùn)行于 Windows NT 或 Windows 2000 上的組件,則應(yīng)使用 /OPT:NOWIN98。
/SUBSYSTEM: 指定子系統(tǒng)?
{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|
WINDOWSCE}[,#[.##]]
/OUT 指定輸出文件名?
/OUT:Hello.exe