在cmd下用cl命令編譯運行C/C++源文件

一直用java來寫程序,java配置好jre路徑之後,在cmd下編譯運行,很方便。

剛好要給一個舍友改下C程序,想到可不可以像java一樣在環境變量裏配置好C的編譯路徑呢?

於是上網搜了一下,得到如下結果:

一、如果裝有VC,那就簡單了,因爲VC帶有C的編譯器,可以將此路徑設置進環境變量。

Windows系統下編譯連接源代碼方法:
cl -GX test.c
-GX: 啓動同步異常處理
上面的命令會產生可執行程序:test.exe
在命令行中直接輸入:test.exe 就可運行該程序

Tips:
一、cmd中鍵入cl提示不認識cl命令,則由於無法找到cl.exe程序。解決方法如下:
添加系統變量(Path),這樣:我的電腦->屬性->高級->環境變量->系統變量,在path中添加
C:/Program Files/Microsoft Visual Studio 9.0/VC/bin;。
注意:
1、結尾最後用“;”隔開!
2、如果你的Microsoft Visual Studio 低於9.0版本或高於9.0版需要修改上面的路徑名稱。

二、cmd中鍵入cl執行編譯時會出現mspdb80.dll無法找到的情況,是因爲VC/Bin/下沒有 “msobj80.dll,
mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”這四個文件,解決的方法:
1>直接從Common7/IDE/下複製這四個文件到VC/Bin/下即可解決
2>添加系統變量(Path),這樣:我的電腦->屬性->高級->環境變量->系統變量,在path中添加 C:/Program Files/Microsoft Visual Studio 8/Common7/IDE;,注意結尾最後用“;”隔開!
這樣在用cl編譯就不會出現mspdb80.dll文件找不到的錯誤了。

三、如果你在編譯過程中,出現一下錯誤:
1、fatal error C1034: stdio.h: no include path set
2、fatal error LNK1104: cannot open file "kernel32.lib
請在我的電腦->屬性->高級->環境變量->系統變量中新建系統變量LIB、INCLUDE並設置它們的值爲:
(LIB)C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib;C:/Program Files/Microsoft SDKs/Windows/v5.0/Lib;C:/Program Files/Microsoft Visual Studio 9.0/VC/lib
(INCLUDE)C:/Program Files/Microsoft Visual Studio 9.0/VC/include

Linux系統下編譯連接源代碼的方法:
gcc -g -c test.c -o test    只生成目標文件(.obj文件),沒有生成可執行文件(也就是說test是.obj文件)

gcc -g test.c -o test        生成可執行文件(可以通過./test運行程序)

-g:生成調試信息。GNU 調試器可利用該信息。
-c:只編譯並生成目標文件。(沒有中間文件生成和可執行文件,如列表文件、可執行文件)
-o:設置生成的可執行程序的名字爲test
上面的命令會產生可執行程序:test
在Terminal中輸入:./test 就可以運行該程序了。

操作步驟如下:

1.在命令行下,先運行vcvars32.bat(此文件在VC安裝目錄/Bin文件夾裏,其中設置了環境變量和路徑等信息)。或者,手動修改環境變量:

path=你安裝VS的路徑/VC98/Bin

lib=你安裝VS的路徑/VC98/lib;你安裝VS的路徑/VC98/MFC/lib

include=你安裝VS的路徑/VC98/include;你安裝VS的路徑/VC98/MFC/include;你安裝VS的路徑/VC98/ATL/lib

2.然後直接用CL編譯器編譯C++程序(如:CL /GX /MT zx.cpp)。

CL經常使用的選項爲:

   多線程dll(/MD)-動態鏈接,不包含運行時庫文件

   多線程(/MT)-靜態鏈接,包含運行時庫文件

附:CL 參數,即編譯選項如下:

-優化-

/O1 最小化空間                                                               /Op[-] 改善浮點數一致性
/O2 最大化速度                                                                /Os 優選代碼空間
/Oa 假設沒有別名                                                           /Ot 優選代碼速度
/Ob<n> 內聯展開(默認 n=0)                                            /Ow 假設交叉函數別名
/Od 禁用優化(默認值)                                                       /Ox 最大化選項。(/Ogityb2 /Gs)
/Og 啓用全局優化                                                            /Oy[-] 啓用框架指針省略
/Oi 啓用內部函數

-代碼生成-

/G3 爲 80386 進行優化                                                           /Gh 啓用 _penter 函數調用
/G4 爲 80486 進行優化                                                            /GH 啓用 _pexit 函數調用
/G5 爲 Pentium 進行優化                                                          /GR[-] 啓用 C++ RTTI
/G6 對 PPro、P-II、P-III 進行優化                                            /GX[-] 啓用 C++ EH (與 /EHsc 相同)
/G7 對 Pentium 4 或 Athlon 進行優化                                      /EHs 啓用 C++ EH (沒有 SEH 異常)
/GB 爲混合模型進行優化(默認)                                                 /EHa 啓用 C++ EH(w/ SEH 異常)
/Gd __cdecl 調用約定                                                              /EHc extern "C" 默認爲 nothrow
/Gr __fastcall 調用約定                                                            /GT 生成纖維安全   TLS 訪問
/Gz __stdcall 調用約定                                                               /Gm[-] 啓用最小重新生成
/GA 爲 Windows 應用程序進行優化                                        /GL[-] 啓用鏈接時代碼生成
/Gf 啓用字符串池                                                                     /QIfdiv[-] 啓用 Pentium FDIV 修復
/GF 啓用只讀字符串池                                                             /QI0f[-] 啓用 Pentium 0x0f 修復
/Gy 分隔鏈接器函數                                                                /QIfist[-] 使用 FIST 而不是 ftol()
/GZ 啓用堆棧檢查(/RTCs)                                                        /RTC1 啓用快速檢查(/RTCsu)
/Ge 對所有函數強制堆棧檢查                                                   /RTCc 轉換爲較小的類型檢查
/Gs[num]   控制堆棧檢查調用                                                    /RTCs 堆棧幀運行時檢查
/GS 啓用安全檢查                                                                    /RTCu 未初始化的本地用法檢查
/clr[:noAssembly] 爲公共語言運行庫編譯
           noAssembly - 不產生程序集
/arch:<SSE|SSE2> CPU 結構的最低要求,以下內容之一:
                        SSE - 啓用支持 SSE 的 CPU 可用的指令
                        SSE2 - 啓用支持 SSE2 的 CPU 可用的指令


/Fa[file] 命名程序集列表文件                                      /Fo<file> 命名對象文件
/FA[sc] 配置程序集列表                                                /Fp<file> 命名預編譯頭文件
/Fd[file] 命名 .PDB 文件                                              /Fr[file] 命名源瀏覽器文件
/Fe<file> 命名可執行文件                                          /FR[file] 命名擴展 .SBR 文件
/Fm[file] 命名映射文件

-預處理器-

/AI<dir> 添加到程序集搜索路徑                                /Fx 將插入的代碼合併到文件
/FU<file> 強制使用程序集/模塊                                   /FI<file> 命名強制包含文件
/C 不抽出註釋                                                            /U<name> 移除預定義宏
/D<name>{=|#}<text> 定義宏                                    /u 移除所有預定義宏
/E 預處理到 stdout                                                   /I<dir> 添加到包含搜索路徑
/EP 預處理到 stdout,沒有 #line                             /X 忽略“標準位置”
/P 預處理到文件

-語言-

/Zi 啓用調試信息                                                     /Ze 啓用擴展(默認)
/ZI 啓用“編輯並繼續”調試信息                              /Zl 省略 .OBJ 中的默認庫名
/Z7 啓用舊式調試信息                                              /Zg 生成函數原型
/Zd 僅有行號調試信息                                              /Zs 只進行語法檢查
/Zp[n] 在 n 字節邊界上包裝結構                             /vd{0|1} 禁用/啓用 vtordisp
/Za 禁用擴展(暗指 /Op)                                             /vm<x> 指向成員的指針類型
/Zc:arg1[,arg2] C++ 語言一致性,這裏的參數可以是:
                      forScope - 對範圍規則強制使用標準 C++
                      wchar_t - wchar_t 是本機類型,不是 typedef

- 雜項 -

@<file> 選項響應文件                                             /wo<n> 發出一次警告 n
/?, /help 打印此幫助消息                                          /w<l><n> 爲 n 設置警告等級 1-4
/c 只編譯,不鏈接                                                  /W<n> 設置警告等級(默認 n=1)
/H<num> 最大外部名稱長度                                    /Wall 啓用所有警告
/J 默認 char 類型是 unsigned                               /Wp64 啓用 64 位端口定位警告
/nologo 取消顯示版權消息                                  /WX 將警告視爲錯誤
/showIncludes 顯示包含文件名                            /WL 啓用單行診斷
/Tc<source file> 將文件編譯爲 .c                          /Yc[file] 創建 .PCH 文件
/Tp<source file> 將文件編譯爲 .cpp                   /Yd 將調試信息放在每個 .OBJ 中
/TC 將所有文件編譯爲 .c                                       /Yl[sym] 爲調試庫插入 .PCH 引用
/TP 將所有文件編譯爲 .cpp                                  /Yu[file] 使用 .PCH 文件
/V<string> 設置版本字符串                                  /YX[file] 自動 .PCH
/w 禁用所有警告                                                    /Y- 禁用所有 PCH 選項
/wd<n> 禁用警告 n                                               /Zm<n> 最大內存分配(默認爲 %)
/we<n> 將警告 n 視爲錯誤

-鏈接-

/MD 與 MSVCRT.LIB 鏈接                                   /MDd 與 MSVCRTD.LIB 調試庫鏈接
/ML 與 LIBC.LIB 鏈接                                        /MLd 與 LIBCD.LIB 調試庫鏈接
/MT 與 LIBCMT.LIB 鏈接                                     /MTd 與 LIBCMTD.LIB 調試庫鏈接
/LD 創建 .DLL                                                       /F<num> 設置堆棧大小
/LDd 創建 .DLL 調試庫                                       /link [鏈接器選項和庫]  

關於鏈接時參數的說明:

VC項目屬性→配置屬性→C/C++→代碼生成→運行時庫 可以採用的方式有:多線程(/MT)、多線程調試(/MTd)、多線程DLL(/MD)、多線程調試DLL(/MDd)、單線程(/ML)、單線程調試(/MLd)

Reusable Library

Switch

Library

Macro(s) Defined

Single Threaded

/ML

LIBC

(none)

Static MultiThread

/MT

LIBCMT

_MT

Dynamic Link (DLL)

/MD

MSVCRT

_MT and _DLL

Debug Single Threaded

/MLd

LIBCD

_DEBUG

Debug Static MultiThread

/MTd

LIBCMTD

_DEBUG and _MT

Debug Dynamic Link (DLL)

/MDd

MSVCRTD

_DEBUG, _MT, and _DLL

 

    其中以小寫“d”結尾的選項表示的DEBUG版本的,沒有“d”的爲RELEASE版本。大型項目中必須要求所有組件和第三方庫的運行時庫是統一的,否則將會出現LNK2005井噴。

    單線程運行時庫選項/ML和/MLd在VS2003以後就被廢了。

    /MT和/MTd表示採用多線程CRT庫的靜態lib版本。該選項會在編譯時將運行時庫以靜態lib的形式完全嵌入。該選項生成的可執行文件運行時不需要運行時庫dll的參加,會獲得輕微的性能提升,但最終生成的二進制代碼因鏈入龐大的運行時庫實現而變得非常臃腫。當某項目以靜態鏈接庫的形式嵌入到多個項目,則可能造成運行時庫的內存管理有多份,最終將導致致命的“Invalid Address specified to RtlValidateHeap”問題。另外託管C++和CLI中不再支持/MT和/MTd選項。

    /MD和/MDd表示採用多線程CRT庫的動態dll版本,會使應用程序使用運行時庫特定版本的多線程DLL。鏈接時將按照傳統VC鏈接dll的方式將運行時庫MSVCRxx.DLL的導入庫MSVCRT.lib鏈接,在運行時要求安裝了相應版本的VC運行時庫可再發行組件包(當然把這些運行時庫dll放在應用程序目錄下也是可以的)。 因/MD和/MDd方式不會將運行時庫鏈接到可執行文件內部,可有效減少可執行文件尺寸。當多項目以MD方式運作時,其內部會採用同一個堆,內存管理將被簡化,跨模塊內存管理問題也能得到緩解。

    結論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要採用了。

 

二、單獨下載gcc程序,同樣的設置環境變量就可以了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章