前幾天據說clang 3.4已經release了,而後我又手癢就折騰一下,在這裏記錄一下折騰的通過。php
在之前就試過clang-cl+VC的開發環境,編譯代碼到是沒發現什麼大問題,有很多警告而已,不過clang不支持生成VC的pdb調試信息,致使生成的程序不能源碼級調試,既然不能調試,那這個環境也沒啥太大的實用價值了,因而就放棄了,又懶得本身編譯MinGW版本的clang,就沒繼續折騰。此次官方發佈3.4的時候直接放了MinGW版本的clang,正好方便了我這樣的懶人,因而我就高高興興的作小白來進行測試了,步驟以下。html
1.在這裏下載了clang的windows版本c++
2.安裝LLVM,安裝完後直接把安裝目錄裏面bin文件夾下的clang++.exe和clang.exe複製到mingw的bin文件夾下windows
3.打開一個命令提示符,把MinGW的bin目錄添加到PATH環境變量中測試
4.順手寫了一個hello.c,內容你們都知道,一個printfui
5.在命令提示符中CD到hello.c所在的文件夾,而後執行 clang -g -o hello.exe hello.c,結果報找不到頭文件stdio.hthis
6.把便已命令改爲了clang -g -o hello.exe -ID:\MinGW\include -ID:\MinGW\mingw32\lib\gcc\mingw32\4.8.1\include hello.c,加了兩個包含目錄,編譯成功,hello.c也能正常執行。google
7.執行gcc hello.exe,測試了下l(列出源碼)、break(下斷點)和r(執行)命令,執行的也很正常spa
到了這裏,我很天真的覺得沒啥問題了,因而就開始找支持clang的IDE,google了一下據說CodeLite支持clang,因而就按照CodeLite的幫助文檔進行配置,配置也很簡單,下載了帶TDM MinGW 4.7.1的CodeLite,而後把clang.exe和clang++.exe丟到自帶的mingw的bin目錄(我這裏是D:\MinGW4.7.1\bin),又用CodeLite寫了個hello word,編譯運行調試都沒啥問題,原覺得到這裏就應該結束了的,可是後面遇到了個問題讓我折騰了一天。前面的hello world都是用的printf打印的,當我用std::cout<<"Hello word!"<<std::endl;測試的時候,發現運行到輸出std::endl程序就會崩潰,嘗試用static編譯的也不行,我覺得是TDM的GCC有問題,因而又換成了官方的MinGW,GCC版本爲4.8.1的,問題依舊...接下來就是蛋疼的google問題解決問題的過程了。debug
最開始我猜想是否是官方編譯的跟個人MinGW不兼容,要本身編譯一下才好,因而我就本身下載了llvm clang和compiler-rt的源碼進行編譯,用4.7.1的GCC編譯一路順暢,沒啥問題,可是編譯出來的clang仍是有問題;換4.8.1的gcc編譯,遇到幾個問題,第一個是在lto.h中有off_t沒定義,明明包含了sys/type.h,可是多是定義了_STRICT_ANSI_被跳過了,google了一頓只有這個比較靠譜,我也只好本身在文件開頭加了個typedef _off_t off_t;,編譯經過,可是問題依舊,編譯的程序遇到std::endl就崩潰,搞的我也要崩潰了。google這個問題,可是我最開始關鍵字用的不對,一直沒找到解決方法。無奈之下抄起IDA和OD,簡單看了下應該是缺乏this指針,也就是調用約定的問題。f**k,看樣仍是clang的問題,我可改不了clang的bug,仍是要google。終於功夫不負有心人,讓我在這裏找到了解決方案,原來真是clang的bug,並且是從clang3.1時就有的bug,也不知道clang的開發人員幹什麼吃的,到如今也不解決,這個bug致使了clang不支持GCC 4.7日後的libstdc++(多是改了以後就不支持4.7以前的libstdc++,不過難道clang的開發人員還在用那麼老的gcc嗎,鬱悶),解決方法很簡單,編輯clang/lib/AST/ItaniumCXXABI.cpp,找到這段代碼:
CallingConv getDefaultMethodCallConv(bool isVariadic) const { return CC_C; }
把它修改爲:
CallingConv getDefaultMethodCallConv(bool isVariadic) const { if (!isVariadic && Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86) return CC_X86ThisCall; else return CC_C; }
而後保存,從新編譯就好了。編譯時還有些小錯誤,愛修改就修改不愛改就直接-i給pass掉了
編譯完後測試了下,問題解決了。
下面寫一下CodeLite的簡單配置:
1.安裝神馬的
2.不用自帶的MinGW,編輯CodeLite安裝目錄下的registry.ini,修改mingw的目錄爲你本身的MinGW的安裝目錄
3.複製編譯好的clang.exe和clang++.exe帶MinGW的bin目錄下
4.打開CodeLite,點Settings-Build Settings,將clang和clang++的Advanced中的Include Path修改成D:\MinGW\lib\gcc\mingw32\4.8.1\include\c++;D:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32;D:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\backward;D:\MinGW\lib\gcc\mingw32\4.8.1\include;D:\MinGW\include;D:\MinGW\lib\gcc\mingw32\4.8.1\include-fixed;D:\MinGW\mingw32\include; 這裏個人MinGW的安裝路徑爲D:\MinGW。
5.打開Settings - Tags Settings,把CTags - Search paths和Clang - Search paths修改成:
d:\MinGW\lib\gcc\mingw32\4.8.1\include\c++
d:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32
d:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\backward
d:\MinGW\lib\gcc\mingw32\4.8.1\include
d:\MinGW\include
d:\MinGW\lib\gcc\mingw32\4.8.1\include-fixed
d:\MinGW\mingw32\include
不想用clang code completion的話,clang的能夠不用設置
都是設置完了,測試了一下,貌似已經沒啥問題了,奉上我編譯的clang 3.4,而後就是截圖留念:
http://www.godebug.org/index.php/archives/77/