拿起cl.exe,放下IDE


  筆者在這里介紹一種使用cl.exe編譯源文件的方法,可以手動執行編譯過程而不再依賴IDE,此外,筆者還介紹一些使用cl.exe編譯簡單源代碼的方式。

  cl.exe是windows平台下的編譯連接程序,其作用是將源代碼編譯並連接成對象文件(*.obj)並自動生成可執行文件(*.exe)。當然,cl.exe還有很多高級功能,在命令行中輸入"cl.exe /?"可查看細節。

  筆者在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等,具體細節可參看文件:

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文件的作用其實是根據用戶的平台來選擇不同的環境配置文件

  筆者使用“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)

   當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應用程序)時,情況則會復雜一點,有興趣的讀者可以自己試一下。(筆者有用詞不當或其它表述錯誤,敬請不吝指出!)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM