在Windows上使用CodeLite+MinGW+Clang進行開發


前幾天聽說clang 3.4已經release了,然后我又手癢就折騰一下,在這里記錄一下折騰的經過。

在以前就試過clang-cl+VC的開發環境,編譯代碼到是沒發現什么大問題,有不少警告而已,不過clang不支持生成VC的pdb調試信息,導致生成的程序不能源碼級調試,既然不能調試,那這個環境也沒啥太大的實用價值了,於是就放棄了,又懶得自己編譯MinGW版本的clang,就沒繼續折騰。這次官方發布3.4的時候直接放了MinGW版本的clang,正好方便了我這樣的懶人,於是我就高高興興的做小白來進行測試了,步驟如下。

1.在這里下載了clang的windows版本

2.安裝LLVM,安裝完后直接把安裝目錄里面bin文件夾下的clang++.exe和clang.exe復制到mingw的bin文件夾下

3.打開一個命令提示符,把MinGW的bin目錄添加到PATH環境變量中

4.順手寫了一個hello.c,內容大家都知道,一個printf

5.在命令提示符中CD到hello.c所在的文件夾,然后執行 clang -g -o hello.exe hello.c,結果報找不到頭文件stdio.h

6.把便已命令改成了clang -g -o hello.exe -ID:\MinGW\include -ID:\MinGW\mingw32\lib\gcc\mingw32\4.8.1\include hello.c,加了兩個包含目錄,編譯成功,hello.c也能正常執行。

7.執行gcc hello.exe,測試了下l(列出源碼)、break(下斷點)和r(執行)命令,執行的也很正常

到了這里,我很天真的以為沒啥問題了,於是就開始找支持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問題解決問題的過程了。

最開始我猜測是不是官方編譯的跟我的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,然后就是截圖留念:
20140218111209.jpg
20140218111230.jpg

 

http://www.godebug.org/index.php/archives/77/


免責聲明!

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



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