[爆卦]mingw-w64 make是什麼?優點缺點精華區懶人包

為什麼這篇mingw-w64 make鄉民發文收入到精華區:因為在mingw-w64 make這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者suhorng ( )看板ASM標題[心得] Windows(32bit)下用MinGW32編L...


照官方說明抓好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)
damody:這超難編的 編到後來感覺很累就不編了= = 07/10 22:02
suhorng:發現沒編OCaml binding Q_Q 少東西 大概又得重編了 07/10 22:13
suhorng:果然用 Linux distribution 才是正道.... 07/10 22:13
tjjh89017:用cygwin會不會好點? 07/10 23:08
suhorng:明天可能先試試用 MSYS 吧, 暫時懶得把手上的 cygwin 07/10 23:27
suhorng:的 GCC 版本更新 07/10 23:27
lantw44:3.3 我用 cmake 編不過所以用 configure 07/11 11:46
lantw44:Windows 版的話我是用 Linux 來 cross compile 07/11 11:46
kingstong:#include <iostream><=光<iostream.h>堪入就錯了 07/13 19:14
kingstong:要除錯是工程師最頭大的,我自己寫是每一小段小好就編譯 07/13 19:15
kingstong:不然等整個程式完成再除錯會讓我起肖的 07/13 19:16
suhorng:他的程式沒錯 07/13 19:39
kingstong:可能版本問題不同 #include<iostream.h>一般標頭檔都是 07/13 20:13
kingstong:以這種形式堪入,不同版本的LIBRARY裡的標頭檔也會小有不 07/13 20:15
kingstong:同,我習慣是叫函式庫.現在的C語言應該也會和當初開發C的 07/13 20:18
kingstong:貝爾實驗室開發出來的C語言不太一樣,雖然邏輯和寫法都差 07/13 20:20
kingstong:不多.美國會保護自己國家的技術,日本也會..... 07/13 20:21
suhorng:其實是C++喔 07/13 21:04
kingstong:差不多,printf(" ")=cout>>.......,c++也可以編譯c的 07/13 21:08
kingstong:語法...... 07/13 21:08
LPH66:嗯, 看到 cout 的箭頭放錯邊就知道樓上大概沒真的用過 C++ 07/13 21:45
LPH66:C++ 在好久以前就建議使用 <iostream> 這種標頭了 07/13 21:45
kingstong:是我的失誤,太久沒碰C\C++了,COUT<<"輸入"<<"\n"; 07/13 22:45
kingstong:CIN>>"輸出"; 07/13 22:46
kingstong:我以前碰到的C++還是要照C的格式引入.h這種type下去寫 07/13 22:48
maerdimer:k某不懂就惦惦,少在這裡鬼扯 07/14 00:02
holymars:歹年冬.... 07/18 20:04
chehsunliu:k在說啥... 07/18 21:11

你可能也想看看

搜尋相關網站