[分享] Windows(32bit)下用MinGW32編LLVM及Clang

看板C_and_CPP作者 ( )時間11年前 (2013/07/10 18:28), 編輯推噓8(8020)
留言28則, 9人參與, 最新討論串1/1
照官方說明抓好code. 目前我編的版本是 LLVM/clang 3.3 clang的code要被放在 llvm-src/tools/clang/ 下面. 我的環境用 MinGW 及 gcc (GCC) 4.7.2, mingw32-make 3.82.90, i686-pc-mingw32 然後另外在外面建一個空資料夾拿來編東西, 例如就叫 llvm-build 加入 compiler default search path llvm預設搜尋路徑是 hard-coded, 若 MinGW 安裝的位置不是預設的 C:\MinGW 或版本太新(如4.7.2)要改 llvm-src/tools/clang/lib/Frontend/InitHeaderSearch.cpp http://stackoverflow.com/questions/6525245/getting-clang-to-work-on-windows 搜尋找到寫 // FIXME: temporary hack: hard-coded paths. 的地方, 往下拉找到 MinGW 的部份, 手動加入用的版本&路徑, 例如: void InitHeaderSearch::AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts) { llvm::Triple::OSType os = triple.getOS(); // FIXME: temporary hack: hard-coded paths. ... switch (os) { case llvm::Triple::MinGW32: // mingw-w64 C++ include paths (i686-w64-mingw32 and x86_64-w64-mingw32) AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.0"); AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.1"); ...(略) + AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.2"); // mingw.org C++ include paths AddMinGWCPlusPlusIncludePaths("/mingw/lib/gcc", "mingw32", "4.5.2"); //MSYS #if defined(_WIN32) AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.2"); AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.1"); ...(略) AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0"); + AddMinGWCPlusPlusIncludePaths("c:/compilers/MinGW/lib/gcc", "mingw32", "4.7.2"); #endif 使用 cmake 做配置. (根本懶人包 XD) 在 llvm-build 下用 cmake PATH-TO-LLVM-SOURCE 來自動偵測環境 & 產生 Makefile 中間可以設一些自己的參數, 例如 -DCMAKE_BUILD_TYPE:STRING=Release 之類 我還有指定 -DLLVM_TARGETS_TO_BUILD:STRING=X86 -G "MinGW Makefiles" 及安裝路徑, -DCMAKE_INSTALL_PREFIX:PATH=PATH-TO-INSTALL-LLVM 真正重要的是因為 MinGW32 的 bug, address rellocation非常慢. 若要 避開這個問題可以用 static linkage http://stackoverflow.com/questions/15310996/clang-slow-startup-using-mingw -DCMAKE_EXE_LINKER_FLAGS=-static -DCMAKE_MODULE_LINKER_FLAGS=-static 編譯 剩下就是沒什麼問題的 mingw32-make mingw32-make check-all mingw32-make install 另, 編譯時也可以指定要開 optimization, 如 mingw32-make ENABLE_OPTIMIZED=1 因為我們用 Windows 的 command line, 測試時有一些 case 會 fail (諸如 "Command not found: echo") 不過用 MSYS 的話 grep, find, diff, etc都有所以多數測資可以過 後記 C++ 程式仍然不能正確的動(with clang++), 一跑就噴 exception 搜尋的時候發現有別人遇到一樣的狀況 http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-June/050837.html 然而這是去年的事了。同樣去年時有人測試 http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-April/021027.html "I try to build Clang for windows with MinGW[1]. I build Clang using gcc-4.6.3[2]. All the programs which are built using it, are compiled and work successfully. But if when I build Clang using gcc-4.7.0[3], programs which written on C++ crash when run-time. C-code programs are compiled and work successfully. simple example: > #include <iostream> > int main() { > std::cout << "Hello world!" << std::endl; > return 0; > } " 也許目前仍然無解? 果然在 Windows 上(ry p.s. llvm都編完後才發現有別人寫了步驟... http://www.dev.idv.tw/mediawiki/index.php/%E5%9C%A8Windows%E4%B8 %8B%E9%9D%A2%E9%80%B2%E8%A1%8CLLVM%E8%88%87CLANG%E7%9A%84%E5%AE% 89%E8%A3%9D 還有 http://stackoverflow.com/questions/14419168/ using-clang-with-codeblocks-on-windows-7 有人提供編好得檔案耶XD 不過我沒測試 阿, llvm asm還一直不得其門而入QQ 官方的 tutorial 都是用官方提供的 binding 不過一方面我不想用 C++ 寫, 另一方面我編的時候忘了弄 OCaml binding, 還不知道要怎麼弄... 難道要重編第四次嗎 orz Haskell的binding還不知道要怎麼裝的說 QQ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.16.131 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: suhorng (140.112.16.131), 時間: 07/10/2013 18:28:32 ※ 編輯: suhorng 來自: 140.112.16.131 (07/10 18:30) ※ 編輯: suhorng 來自: 118.166.47.118 (07/10 20:38)

07/10 22:02, , 1F
這超難編的 編到後來感覺很累就不編了= =
07/10 22:02, 1F

07/10 22:13, , 2F
發現沒編OCaml binding Q_Q 少東西 大概又得重編了
07/10 22:13, 2F

07/10 22:13, , 3F
果然用 Linux distribution 才是正道....
07/10 22:13, 3F

07/10 23:08, , 4F
用cygwin會不會好點?
07/10 23:08, 4F

07/10 23:27, , 5F
明天可能先試試用 MSYS 吧, 暫時懶得把手上的 cygwin
07/10 23:27, 5F

07/10 23:27, , 6F
的 GCC 版本更新
07/10 23:27, 6F

07/11 11:46, , 7F
3.3 我用 cmake 編不過所以用 configure
07/11 11:46, 7F

07/11 11:46, , 8F
Windows 版的話我是用 Linux 來 cross compile
07/11 11:46, 8F

07/13 19:14, , 9F
#include <iostream><=光<iostream.h>堪入就錯了
07/13 19:14, 9F

07/13 19:15, , 10F
要除錯是工程師最頭大的,我自己寫是每一小段小好就編譯
07/13 19:15, 10F

07/13 19:16, , 11F
不然等整個程式完成再除錯會讓我起肖的
07/13 19:16, 11F

07/13 19:39, , 12F
他的程式沒錯
07/13 19:39, 12F

07/13 20:13, , 13F
可能版本問題不同 #include<iostream.h>一般標頭檔都是
07/13 20:13, 13F

07/13 20:15, , 14F
以這種形式堪入,不同版本的LIBRARY裡的標頭檔也會小有不
07/13 20:15, 14F

07/13 20:18, , 15F
同,我習慣是叫函式庫.現在的C語言應該也會和當初開發C的
07/13 20:18, 15F

07/13 20:20, , 16F
貝爾實驗室開發出來的C語言不太一樣,雖然邏輯和寫法都差
07/13 20:20, 16F

07/13 20:21, , 17F
不多.美國會保護自己國家的技術,日本也會.....
07/13 20:21, 17F

07/13 21:04, , 18F
其實是C++喔
07/13 21:04, 18F

07/13 21:08, , 19F
差不多,printf(" ")=cout>>.......,c++也可以編譯c的
07/13 21:08, 19F

07/13 21:08, , 20F
語法......
07/13 21:08, 20F

07/13 21:45, , 21F
嗯, 看到 cout 的箭頭放錯邊就知道樓上大概沒真的用過 C++
07/13 21:45, 21F

07/13 21:45, , 22F
C++ 在好久以前就建議使用 <iostream> 這種標頭了
07/13 21:45, 22F

07/13 22:45, , 23F
是我的失誤,太久沒碰C\C++了,COUT<<"輸入"<<"\n";
07/13 22:45, 23F

07/13 22:46, , 24F
CIN>>"輸出";
07/13 22:46, 24F

07/13 22:48, , 25F
我以前碰到的C++還是要照C的格式引入.h這種type下去寫
07/13 22:48, 25F

07/14 00:02, , 26F
k某不懂就惦惦,少在這裡鬼扯
07/14 00:02, 26F

07/18 20:04, , 27F
歹年冬....
07/18 20:04, 27F

07/18 21:11, , 28F
k在說啥...
07/18 21:11, 28F
文章代碼(AID): #1HtJTHZb (C_and_CPP)