在MSYS2和MinGW-W64編譯GCC6.3

嘗試自己動手在Windows上編譯GCC6.3。以前瞭解過Cygwin和MinGW,這兩個工具是Windows上編譯Linux程序的典型配置。但是這些工具都古老了,這裏嘗試使用MSYS2 + MinGW-W64結合來編譯GCC6.3。本人親測,依據如下步驟保證能夠編譯通過:

1). 到{http:\\www.msys2.org\}下載MSYS2,我下載的版本是{msys2-x86_64-20161025.exe},並在Win7-64bit上安裝到{C:\msys64}目錄下。注意,在{C:\msys64}下可以發現{mingw32.exe}/{mingw64.exe}/{msys2.exe}等,由於是Win7/64bit環境,因此直接執行{mingw64.exe}啓動64bit的MSYS2環境。

2). 依據{http:\\www.msys2.org\}的提示,安裝基本組件。即使用{pacman -Syu}和{pacman -Su}來安裝基本組件。但是由於網絡太慢,同時可能斷線,安裝非常耗時,這個時候通常有兩種做法:

i). 從{https:\\sourceforge.net\projects\msys2\files\REPOS\MSYS2\x86_64\}上單獨下載每個組件的安裝包,例如{msys2-runtime-2.7.0-1-x86_64.pkg.tar.xz}等,並利用{pacman -U [包名].pkg.tar.xz}來單獨安裝某個安裝包。基本組件包括5個包{msys2-runtime-2.7.0-1-x86_64.pkg.tar.xz / bash-4.4.012-1-x86_64.pkg.tar.xz / filesystem-2017.02-4-x86_64.pkg.tar.xz / mintty-1~2.7.3-1-x86_64.pkg.tar.xz / pacman-5.0.1-2-x86_64.pkg.tar.xz}。分別安裝完這幾個包,就完成了基本包的安裝。注意{pacman -U 包}是基於下載好的包安裝包的方法。另外也可以{pacman -U *}來安裝多個包,這種方法的好處是自動解決包之間的依賴。

ii). 另外一種方法和上面的方法相似,但是把上訴5個安裝包放到{C:\msys64\var\cache\pacman\pkg}路徑下,再執行{pacman -Syu}和{pacman -Su}也可以完成基本組件的安裝。

3). 安裝MinGW64-W64,通過{pacman -S mingw-w64-x86_64-toolchain}即可完成,本人安裝的是{mingw-w64-x86_64-gcc-6.3.0-2-any.pkg.tar.xz}版本。安裝完成後就出現{C:\msys64\mingw64}目錄

4). 安裝GCC的依賴包,主要包括{git / tar make diffutils/m4texinfo}等,可以使用{pacman -S git}等方法來安裝,也可以採用上面i)/ii)的方法來安裝。其中git由於依賴太多,安裝比較費勁。注意,這裏又展示了pacman安裝組件的方法:基於組件名字的方法,使用-S參數;上面的方法是基於組件的安裝包用-U來安裝。

5). 下載GCC6.3的源碼{gcc-6.3.0.tar.gz}並解壓到{C:\msys64\home\{用戶名}\gcc-6.3.0}下

6). Linux環境軟件源碼安裝的基本步驟是:{./configure && make && make install}。但是GCC的{./configure}需要傳遞非常的配置參數。一個通常的方法是:在bash命令行輸入{gcc -v}就可以等到MinGW-W64的GCC所對應的{./configure}參數如下:


這個參數基本可用,但是需要強調幾點:

i). 請務必參看 {https://gcc.gnu.org/install/configure.html}來理解這些參數的含義

ii).在上面的參數中{--with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include}是必須指定的,否則會提示{mingw/inclue}路徑不存在的錯誤,這是由於MinGW-W64和GCC代碼不匹配的原因:通過{grep -nrw 'mingw/include'}可以得到如下結果(有刪節):


但是根本不存在{mingw/include}的目錄結構,其目錄結構爲{C:\msys64\mingw64\include} / {C:\msys64\mingw64\x86_64-w64-mingw32\include}等。

iii). 顯然{--enable-languages=c,lto,c++,objc,obj-c++,fortran,ada}也是需要修改的,當然是依據自己的需求來改,本人只編譯了C語言

iv). {--libexecdir=/mingw64/lib}和{--enable-bootstrap}也是一個坑人的組合!本人修改爲{--libexecdir=/mingw64/bin}和{--disable-bootstrap}後能夠完成GCC的正常編譯。因此一個可以完成編譯的{./configure}參數是:


行文至此,GCC的編譯依據結束,但是我們希望嘗試一下其它組合:

7). 首先組合一下{--libexecdir=/mingw64/lib --disable-bootstrap},能夠編譯通過,說明{--libexecdir=/mingw64/bin}影響不重要;再組合{--libexecdir=/mingw64/bin--enable-bootstrap}則出現了比較多的問題,不在這裏詳述

8). 在某些情況下,需要使用Windows的命令行來控制MSYS2編譯GCC,例如在Jenkins中自動構建的時候。可以使用下面的方法:

- 生成一個gcc_build.sh文件,裏面添加上文描述的GCC編譯步驟{即configure/make/make install}

- 利用MSYS2自帶的bash.exe來運行gcc_build.sh即{bash gcc_build.sh},這時會發現無法定位MinGW64的頭文件等信息而導致編譯錯誤。其根本原因是:在bash執行過程中沒有設置好MSYS2和MINGW64的運行環境。因此需要在gcc_build.sh文件的頭部添加如下代碼:


這樣在{cmd.exe}窗口中運行{bash gcc_build.sh}就像在{mingw64.exe}運行{gcc_build.sh}相似了。但是還差最後一步:就是{gcc_build.sh}中的路徑應該使用絕對路徑而不是相對路徑!例如{../../configure XXXX}是無使用法運行的,應該使用在{mingw64.exe}環境中的絕對路徑例如{/home/XXX/gcc6.c/configure}來運行,這和上面{source /etc/profile}命令是相似的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章