學習總是循序漸進的過程,之前一節我們知道怎么安裝配置clang,相當於我們知道了how to do. 這一次我們來解釋一下我們做了些什么,知道why do so.
1. Get the required tools
2. Check out LLVM 和 clang
3. Run CMake to generate the Visual Studio solution and project files
運行CMake生成Visual Studio解決方案和工程文件。那么為什么我們在生成LLVM.sln時要用Cmake呢?它是什么工具,究竟在幫助我們干了一件什么事情呢?
我們知道,我們從SVN上download下來的都是源文件,許多的源文件依照一定的結構和功能組織在一起,我們怎么使用這些源文件呢?怎么才能讓它們像我們用VS構建的解決方案一樣呢?對,我們需要一個把這些源文件生成我們想要看到的VS中解決方案的工具,這就是Cmake在這里的作用。
Cmake是跨平台的,可以通過編寫CMakeLists.txt配置文件,控制生成在Linux/Unix平台的Makefile或者windows下工程文件。
這里我們就知道了,利用Cmake是生成解決方案的。
4. Build Clang
我們現在得到了LLVM.sln,就可以按照我們自己熟悉的方式進行操作了。生成clang。在這個解決方案中我們看到有358個項目,全部進行進行生成,需要花費很長時間,所以我們只生成clang這個project,而不是選擇ALL_BUILD。我們在后面進行再次開發的時候,也一定會添加一些源文件,這時候我們要重新生成,但着實很坑,我們真的要用rebuild嗎?不不,下面,我們略講一點visual studio里面build,rebuild,以及run和build之間的聯系和區別。
4.1 build和rebuild
Rebuild是對Solution下的所有項目,逐個進行 Clean+Build。不論文件更改與否;
Clean+Build是對選中的項目先執行Clean再執行Build。(如果選中Solution的話,全部Clean之后,再全部Build);
Build只是針對有更改過的文件進行編譯。而Rebuild會編譯所有。
推薦用 Clean+Build 或者Build。
Build solution ---編譯解決方案,和build“項目名”的不同之處很明顯:一個解決方案可以包含多個項目,編譯解決方案就是編譯這個解決方案中的所有項目,而build“項目名”就只是編譯當前的項目;
至於rebuild,有過很多次這樣的經歷:把一個項目解決方案編譯后,如果沒有做過任何改動,點擊build菜單命令就不會再編譯,那怕你刪除了原來編譯生成的dll或exe文件,vs.net仍然會因為未檢測到項目中有新的改動而拒絕編譯,但點擊rebuild,不管上次編譯后有沒有做過改動,vs.net都會重新編譯。
(轉載自:http://www.cnblogs.com/tylerdonet/archive/2012/02/03/2336985.html)
4.2 run和build
我們都知道程序經過預處理,編譯,鏈接,然后才能運行;那么在visual studio中是如何對應的呢?在VS中我們比較常用的就是build和run, build可以進行這三步預處理,編譯,鏈接,也就是形成了.exe或者.dll,但是沒有運行,因為有時候一個解決方案下有很多.exe,我們要執行哪一個取決於我們自己;而點擊run,就是執行預處理,編譯,鏈接,運行。這四步,就像我們執行一個打印”hello world”的main.cpp,直接會運行那個.exe文件。
5. VS build后生成的常見文件解釋
5.1 obj (objective)
中間文件,也稱為目標代碼。每個文件經過預處理和編譯后形成的中間代碼,之后與資源文件,例如一些第三方庫文件等,經過連接,生成可執行文件。
5.2 pdb (program debug database)
保存調試和項目狀態信息,從而可以對程序的調試配置進行增量鏈接。
5.3 ilk
臨時連接文件
.exe .pdb .ilk 這三個在build/Debug/bin 文件夾下非常的常見,,且成組出現。除此之外, .vcproj 是記錄vs project所有信息; .suo 就是 solution user options 解決方案的用戶選項,一種配置文件。
下面一節,主要講解在Windows下運行scan-build等會遇到的一些問題和如何解決,另外再簡單講一下如何讓自己的第一個checker 出現在clang 的checker列表里,就是我們在運行”clang -cc1 -analyzer-checker-help” 時可以看到自己定義的checker,是不是還有一點兒小激動。哈哈~
參考文章:
http://www.cnblogs.com/shine-yr/p/5214764.html
http://www.cnblogs.com/tylerdonet/archive/2012/02/03/2336985.html
http://www.cnblogs.com/gamesky/archive/2013/06/24/3151982.html