筆者在這裏介紹一種使用cl.exe編譯源文件的方法,能夠手動執行編譯過程而再也不依賴IDE,此外,筆者還介紹一些使用cl.exe編譯簡單源代碼的方式。linux
cl.exe是windows平臺下的編譯鏈接程序,其做用是將源代碼編譯並鏈接成對象文件(*.obj)並自動生成可執行文件(*.exe)。固然,cl.exe還有不少高級功能,在命令行中輸入"cl.exe /?"可查看細節。c++
筆者在win 7(x86)系統中安裝的IDE爲VS2010,採用默認的安裝配置,安裝後cl.exe的文件路徑爲:編程
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin
筆者在桌面用文本編輯器編輯了一個hello.c文件,其內容爲輸出"hello world!"。在CMD中切換工做目錄至桌面,而後鍵入"cl.exe hello.c",運行時則獲得錯誤。這是由於cl.exe的運行依賴不少的環境變量,如INCLUDE,LIB,PATH等,具體細節可參看文件:windows
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat
在vcvars32.bat是一個環境配置文件,其中配置了cl.exe運行的所有條件。(筆者注:當代碼中涉及調用第三方庫函數時,此時則應該修改環境配置文件)編輯器
其實,安裝VS2010後,開始欄中出現一個爲「visual stdio 命令提示(2010)"的程序,觀察其」屬性」發現,該程序是在調用一個bat文件:函數
C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat
該bat文件的做用實際上是根據用戶的平臺來選擇不一樣的環境配置文件。spa
筆者使用「visual stdio 命令提示(2010)」程序,切換工做目錄至桌面,而後鍵入"cl.exe hello.c",結果cl.exe成功執行,並生成了對象文件hello.obj和可執行文件hello.exe。命令行
筆者編輯了一個bat文件,文件名爲MyComplier.bat,其內容爲:對象
start C:\"Program Files"\"Microsoft Visual Studio 10.0"\VC\vcvarsall.bat x86
(筆者注:1,調用vcvarsall.bat時的參數「x86」是依賴於用戶機器的,具體細節可參看vcvarsall.bat;2,在筆者的機器上,MyComplier.bat也可寫成(根據絕對路徑)調用vcvars32.bat)blog
當MyComplier.bat和源代碼在同一個目錄下,則經過運行MyComplier.bat能夠完成cl.exe的配置,而後天然就能夠利用cl.exe來手動執行編譯鏈接過程。至此,筆者實現了文本編輯器+MyComplier.bat的簡易IDE。
這樣作的好處十分明顯:若是僅僅是爲了運行一個C/CPP文件,根本不用啓動像vs2010這樣重量級的IDE,省時省力。固然,這樣作也有缺陷,沒法DEBUG,並且面對大型的工程項目則顯得不夠用。可是,筆者認爲,這篇文章的意義在於爲讀者提供了一種輕量級的IDE解決方案。只須要將MyComplier.bat文件和源代碼放在同一個文件中,運行bat文件後便可順利使用cl.exe,還有什麼比這種方法更簡潔?
最後,筆者根據本身使用cl.exe的經驗寫出如下幾點使用技巧,供讀者參考。
a,若是將上文中的文件hello.c重命名爲"hello.txt",則使用命令「cl.exe hello.txt /TC」仍然能夠編譯成功。
b,考慮這種狀況,ZooAnimal.h文件中聲明瞭類ZooAnimal的成員函數,ZooAnimal.cpp中則實現了這些成員函數,而後在第三個文件main.cpp中「#include "ZooAnimal.h"」來使用類ZooAnimal。當執行"cl.exe main.cpp"時則會提示錯誤。此時解決辦法有兩種,第一:修改main.cpp爲「#include "ZooAnimal.cpp"」,第二種:先執行"cl.exe ZooAnimal.cpp",獲得一個沒有問題的"ZooAnimal.obj"和一個錯誤的"ZooAnimal.exe"(由於ZooAnimal.cpp中沒有main函數)。而後再執行"cl.exe main.cpp /link ZooAnimal.obj"則編譯成功(熟悉linux編譯的讀者對這種方法應該十分眼熟了)。
c,(與b相似)fun.h中聲明瞭一些函數,而後fun.c中實現了這些函數,第三個文件main.cpp中則經過「#include "fun.h"」來使用這些函數。參照b的兩段式編譯方法,此時仍然獲得錯誤。這是由於,編譯fun.c時,編譯器則以c的風格來處理函數,當編譯main.cpp時,編譯器則採用c++風格來處理函數,此時編譯器天然會提示「 error LNK2019: 沒法解析的外部符號」,所以,在編譯fun.c時應該使用cl的擴展選項"/TP「,執行"cl.exe fun.c /TP",而後再執行"cl.exe main.cpp /link fun.obj"就能夠編譯成功了。
筆者將vs2010安裝後對應的include文件,lib文件,bin中的exe文件等必備的文件拷貝出來,本身動手合成了一個可移動的C/C++編譯平臺,在一個虛擬的win7(無任何IDE)中成功編譯了一個hello.c文件。固然,當源碼使用到了一些高級編程方法(如mfc,windows應用程序)時,狀況則會複雜一點,有興趣的讀者能夠本身試一下。(筆者有用詞不當或其它表述錯誤,敬請不吝指出!)