在cmd命令行下编译运行C/C++源文件
一直用java來寫程序,java配置好jre路徑之后,在cmd下編譯運(yùn)行,很方便。
剛好要給一個(gè)舍友改下C程序,想到可不可以像java一樣在環(huán)境變量里配置好C的編譯路徑呢?
于是上網(wǎng)搜了一下,得到如下結(jié)果:
一、如果裝有VC,那就簡單了,因?yàn)閂C帶有C的編譯器,可以將此路徑設(shè)置進(jìn)環(huán)境變量。
Windows系統(tǒng)下編譯連接源代碼方法:
cl -GX test.c
-GX: 啟動同步異常處理
上面的命令會產(chǎn)生可執(zhí)行程序:test.exe
在命令行中直接輸入:test.exe 就可運(yùn)行該程序
Tips:
一、cmd中鍵入cl提示不認(rèn)識cl命令,則由于無法找到cl.exe程序。解決方法如下:
添加系統(tǒng)變量(Path),這樣:我的電腦->屬性->高級->環(huán)境變量->系統(tǒng)變量,在path中添加
C:/Program Files/Microsoft Visual Studio 9.0/VC/bin;。
注意:
1、結(jié)尾最后用“;”隔開!
2、如果你的Microsoft Visual Studio 低于9.0版本或高于9.0版需要修改上面的路徑名稱。
二、cmd中鍵入cl執(zhí)行編譯時(shí)會出現(xiàn)mspdb80.dll無法找到的情況,是因?yàn)閂C/Bin/下沒有 “msobj80.dll,
mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”這四個(gè)文件,解決的方法:
1>直接從Common7/IDE/下復(fù)制這四個(gè)文件到VC/Bin/下即可解決
2>添加系統(tǒng)變量(Path),這樣:我的電腦->屬性->高級->環(huán)境變量->系統(tǒng)變量,在path中添加 C:/Program Files/Microsoft Visual Studio 8/Common7/IDE;,注意結(jié)尾最后用“;”隔開!
這樣在用cl編譯就不會出現(xiàn)mspdb80.dll文件找不到的錯誤了。
三、如果你在編譯過程中,出現(xiàn)一下錯誤:
1、fatal error C1034: stdio.h: no include path set
2、fatal error LNK1104: cannot open file "kernel32.lib
請?jiān)谖业碾娔X->屬性->高級->環(huán)境變量->系統(tǒng)變量中新建系統(tǒng)變量LIB、INCLUDE并設(shè)置它們的值為:
(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系統(tǒng)下編譯連接源代碼的方法:
gcc -g -c test.c -o test??? 只生成目標(biāo)文件(.obj文件),沒有生成可執(zhí)行文件(也就是說test是.obj文件)
gcc -g test.c -o test??????? 生成可執(zhí)行文件(可以通過./test運(yùn)行程序)
-g:生成調(diào)試信息。GNU 調(diào)試器可利用該信息。
-c:只編譯并生成目標(biāo)文件。(沒有中間文件生成和可執(zhí)行文件,如列表文件、可執(zhí)行文件)
-o:設(shè)置生成的可執(zhí)行程序的名字為test
上面的命令會產(chǎn)生可執(zhí)行程序:test
在Terminal中輸入:./test 就可以運(yùn)行該程序了。
操作步驟如下:
1.在命令行下,先運(yùn)行vcvars32.bat(此文件在VC安裝目錄/Bin文件夾里,其中設(shè)置了環(huán)境變量和路徑等信息)。或者,手動修改環(huán)境變量:
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經(jīng)常使用的選項(xiàng)為:
?? 多線程dll(/MD)-動態(tài)鏈接,不包含運(yùn)行時(shí)庫文件
?? 多線程(/MT)-靜態(tài)鏈接,包含運(yùn)行時(shí)庫文件
附:CL 參數(shù),即編譯選項(xiàng)如下:
-優(yōu)化-?
/O1 最小化空間??????????????????????????????????????????????????? ?????????? /Op[-] 改善浮點(diǎn)數(shù)一致性?
/O2 最大化速度??????????????????????????????????????????????????????????????? /Os 優(yōu)選代碼空間?
/Oa 假設(shè)沒有別名?????????????????????????????????????????????????????????? /Ot 優(yōu)選代碼速度?
/Ob<n> 內(nèi)聯(lián)展開(默認(rèn) n=0)??????????????????????????????????????????? /Ow 假設(shè)交叉函數(shù)別名?
/Od 禁用優(yōu)化(默認(rèn)值)?????????????????????????????????????????????????????? /Ox 最大化選項(xiàng)。(/Ogityb2 /Gs)?
/Og 啟用全局優(yōu)化??????????????????????????????????????????????????????????? /Oy[-] 啟用框架指針省略?
/Oi 啟用內(nèi)部函數(shù)?
-代碼生成-?
/G3 為 80386 進(jìn)行優(yōu)化?????????????????????????????????????????????????????????? /Gh 啟用 _penter 函數(shù)調(diào)用?
/G4 為 80486 進(jìn)行優(yōu)化??????????????????????????????????????????????????????????? /GH 啟用 _pexit 函數(shù)調(diào)用?
/G5 為 Pentium 進(jìn)行優(yōu)化????????????????????????????????????????????????????????? /GR[-] 啟用 C++ RTTI?
/G6 對 PPro、P-II、P-III 進(jìn)行優(yōu)化 ?????????????????????????????????????????? /GX[-] 啟用 C++ EH (與 /EHsc 相同)?
/G7 對 Pentium 4 或 Athlon 進(jìn)行優(yōu)化????????????????????????????????????? /EHs 啟用 C++ EH (沒有 SEH 異常)?
/GB 為混合模型進(jìn)行優(yōu)化(默認(rèn)) ??????????????????????????????????????????????? /EHa 啟用 C++ EH(w/ SEH 異常)?
/Gd __cdecl 調(diào)用約定 ???????????????????????????????????????????????????????????? /EHc extern "C" 默認(rèn)為 nothrow?
/Gr __fastcall 調(diào)用約定 ?????????????????????????????????????????????????????????? /GT 生成纖維安全?? TLS 訪問?
/Gz __stdcall 調(diào)用約定?????????????????????????????????????????????????????????????? /Gm[-] 啟用最小重新生成?
/GA 為 Windows 應(yīng)用程序進(jìn)行優(yōu)化 ?????????????????????????????????????? /GL[-] 啟用鏈接時(shí)代碼生成?
/Gf 啟用字符串池 ??????????????????????????????????????????????????????????????????? /QIfdiv[-] 啟用 Pentium FDIV 修復(fù)?
/GF 啟用只讀字符串池 ??????????????????????????????????????????????????????????? /QI0f[-] 啟用 Pentium 0x0f 修復(fù)?
/Gy 分隔鏈接器函數(shù) ?????????????????????????????????????????????????????????????? /QIfist[-] 使用 FIST 而不是 ftol()?
/GZ 啟用堆棧檢查(/RTCs) ?????????????????????????????????????????????????????? /RTC1 啟用快速檢查(/RTCsu)?
/Ge 對所有函數(shù)強(qiáng)制堆棧檢查 ????????????????????????????????????????????????? /RTCc 轉(zhuǎn)換為較小的類型檢查?
/Gs[num]?? 控制堆棧檢查調(diào)用??????????????????????????????????????????????????? /RTCs 堆棧幀運(yùn)行時(shí)檢查?
/GS 啟用安全檢查 ?????????????????????????????????????????????????????????????????? /RTCu 未初始化的本地用法檢查?
/clr[:noAssembly] 為公共語言運(yùn)行庫編譯?
?????????? noAssembly - 不產(chǎn)生程序集?
/arch:<SSE|SSE2> CPU 結(jié)構(gòu)的最低要求,以下內(nèi)容之一:?
??????????????????????? SSE - 啟用支持 SSE 的 CPU 可用的指令?
??????????????????????? SSE2 - 啟用支持 SSE2 的 CPU 可用的指令?
-輸出文件-?
/Fa[file] 命名程序集列表文件 ???????????????????????????????????? /Fo<file> 命名對象文件?
/FA[sc] 配置程序集列表??????????????????????????????????????????????? /Fp<file> 命名預(yù)編譯頭文件?
/Fd[file] 命名 .PDB 文件????????????????????????????????????????????? /Fr[file] 命名源瀏覽器文件?
/Fe<file> 命名可執(zhí)行文件 ???????????????????????????????????????? /FR[file] 命名擴(kuò)展 .SBR 文件?
/Fm[file] 命名映射文件?
-預(yù)處理器-?
/AI<dir> 添加到程序集搜索路徑??????????????????????????????? /Fx 將插入的代碼合并到文件?
/FU<file> 強(qiáng)制使用程序集/模塊?????????????????????????????????? /FI<file> 命名強(qiáng)制包含文件?
/C 不抽出注釋??????????????????????????????????????????????????????????? /U<name> 移除預(yù)定義宏?
/D<name>{=|#}<text> 定義宏??????????????????????????????????? /u 移除所有預(yù)定義宏?
/E 預(yù)處理到 stdout?????????????????????????????????????????????????? /I<dir> 添加到包含搜索路徑?
/EP 預(yù)處理到 stdout,沒有 #line???????????????????????????? /X 忽略“標(biāo)準(zhǔn)位置”?
/P 預(yù)處理到文件?
-語言-?
/Zi 啟用調(diào)試信息???????????????????????????????????????????????????? /Ze 啟用擴(kuò)展(默認(rèn))?
/ZI 啟用“編輯并繼續(xù)”調(diào)試信息????????????????????????????? /Zl 省略 .OBJ 中的默認(rèn)庫名?
/Z7 啟用舊式調(diào)試信息????????????????????????????????????????????? /Zg 生成函數(shù)原型?
/Zd 僅有行號調(diào)試信息????????????????????????????????????????????? /Zs 只進(jìn)行語法檢查?
/Zp[n] 在 n 字節(jié)邊界上包裝結(jié)構(gòu)???????????????????????????? /vd{0|1} 禁用/啟用 vtordisp?
/Za 禁用擴(kuò)展(暗指 /Op)???????????????????????????????????????????? /vm<x> 指向成員的指針類型?
/Zc:arg1[,arg2] C++ 語言一致性,這里的參數(shù)可以是:?
????????????????????? forScope - 對范圍規(guī)則強(qiáng)制使用標(biāo)準(zhǔn) C++?
????????????????????? wchar_t - wchar_t 是本機(jī)類型,不是 typedef?
- 雜項(xiàng) -?
@<file> 選項(xiàng)響應(yīng)文件???????????????????????????????????????????? /wo<n> 發(fā)出一次警告 n?
/?, /help 打印此幫助消息????????????????????????????????????????? /w<l><n> 為 n 設(shè)置警告等級 1-4?
/c 只編譯,不鏈接????????????????????????????????????????????????? /W<n> 設(shè)置警告等級(默認(rèn) n=1)?
/H<num> 最大外部名稱長度??????????????????????????????????? /Wall 啟用所有警告?
/J 默認(rèn) char 類型是 unsigned?????????????????????????????? /Wp64 啟用 64 位端口定位警告?
/nologo 取消顯示版權(quán)消息????????????????????????????????? /WX 將警告視為錯誤?
/showIncludes 顯示包含文件名??????????????????????????? /WL 啟用單行診斷?
/Tc<source file> 將文件編譯為 .c????????????????????????? /Yc[file] 創(chuàng)建 .PCH 文件?
/Tp<source file> 將文件編譯為 .cpp ????????????????? /Yd 將調(diào)試信息放在每個(gè) .OBJ 中?
/TC 將所有文件編譯為 .c?????????????????????????????????????? /Yl[sym] 為調(diào)試庫插入 .PCH 引用?
/TP 將所有文件編譯為 .cpp????????????????????????????????? /Yu[file] 使用 .PCH 文件?
/V<string> 設(shè)置版本字符串 ???????????????????????????????? /YX[file] 自動 .PCH?
/w 禁用所有警告??????????????????????????????????????????????? ??? /Y- 禁用所有 PCH 選項(xiàng)?
/wd<n> 禁用警告 n?????????????????????????????? ??????????? ??? /Zm<n> 最大內(nèi)存分配(默認(rèn)為 %)?
/we<n> 將警告 n 視為錯誤?
-鏈接-?
/MD 與 MSVCRT.LIB 鏈接??????????????????????????????? ?? /MDd 與 MSVCRTD.LIB 調(diào)試庫鏈接?
/ML 與 LIBC.LIB 鏈接??????????????????????????????????????? /MLd 與 LIBCD.LIB 調(diào)試庫鏈接?
/MT 與 LIBCMT.LIB 鏈接???????????????????????????????????? /MTd 與 LIBCMTD.LIB 調(diào)試庫鏈接?
/LD 創(chuàng)建 .DLL?????????????????????????????????????????????????????? /F<num> 設(shè)置堆棧大小?
/LDd 創(chuàng)建 .DLL 調(diào)試庫?????????????????????????????????????? /link [鏈接器選項(xiàng)和庫]??
?
關(guān)于鏈接時(shí)參數(shù)的說明:
VC項(xiàng)目屬性→配置屬性→C/C++→代碼生成→運(yùn)行時(shí)庫 可以采用的方式有:多線程(/MT)、多線程調(diào)試(/MTd)、多線程DLL(/MD)、多線程調(diào)試DLL(/MDd)、單線程(/ML)、單線程調(diào)試(/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”結(jié)尾的選項(xiàng)表示的DEBUG版本的,沒有“d”的為RELEASE版本。大型項(xiàng)目中必須要求所有組件和第三方庫的運(yùn)行時(shí)庫是統(tǒng)一的,否則將會出現(xiàn)LNK2005井噴。
??? 單線程運(yùn)行時(shí)庫選項(xiàng)/ML和/MLd在VS2003以后就被廢了。
??? /MT和/MTd表示采用多線程CRT庫的靜態(tài)lib版本。該選項(xiàng)會在編譯時(shí)將運(yùn)行時(shí)庫以靜態(tài)lib的形式完全嵌入。該選項(xiàng)生成的可執(zhí)行文件運(yùn)行時(shí)不需要運(yùn)行時(shí)庫dll的參加,會獲得輕微的性能提升,但最終生成的二進(jìn)制代碼因鏈入龐大的運(yùn)行時(shí)庫實(shí)現(xiàn)而變得非常臃腫。當(dāng)某項(xiàng)目以靜態(tài)鏈接庫的形式嵌入到多個(gè)項(xiàng)目,則可能造成運(yùn)行時(shí)庫的內(nèi)存管理有多份,最終將導(dǎo)致致命的“Invalid Address specified to RtlValidateHeap”問題。另外托管C++和CLI中不再支持/MT和/MTd選項(xiàng)。
??? /MD和/MDd表示采用多線程CRT庫的動態(tài)dll版本,會使應(yīng)用程序使用運(yùn)行時(shí)庫特定版本的多線程DLL。鏈接時(shí)將按照傳統(tǒng)VC鏈接dll的方式將運(yùn)行時(shí)庫MSVCRxx.DLL的導(dǎo)入庫MSVCRT.lib鏈接,在運(yùn)行時(shí)要求安裝了相應(yīng)版本的VC運(yùn)行時(shí)庫可再發(fā)行組件包(當(dāng)然把這些運(yùn)行時(shí)庫dll放在應(yīng)用程序目錄下也是可以的)。 因/MD和/MDd方式不會將運(yùn)行時(shí)庫鏈接到可執(zhí)行文件內(nèi)部,可有效減少可執(zhí)行文件尺寸。當(dāng)多項(xiàng)目以MD方式運(yùn)作時(shí),其內(nèi)部會采用同一個(gè)堆,內(nèi)存管理將被簡化,跨模塊內(nèi)存管理問題也能得到緩解。
??? 結(jié)論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時(shí)放棄,/MT和/MTd在非必要時(shí)最好也不要采用了。
?
二、單獨(dú)下載gcc程序,同樣的設(shè)置環(huán)境變量就可以了。
總結(jié)
以上是生活随笔為你收集整理的在cmd命令行下编译运行C/C++源文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同一进程中的线程究竟共享哪些资源
- 下一篇: C++中的继承与虚函数各种概念