在cmd命令行下编译运行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)。
|   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程序,同樣的設置環境變量就可以了。
總結
以上是生活随笔為你收集整理的在cmd命令行下编译运行C/C++源文件的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 同一进程中的线程究竟共享哪些资源
 - 下一篇: 学习vi和vim编辑器(8):全局替换(