在MSYS2和MinGW-W64编译GCC6.3

来源:互联网 发布:淘宝车品优质特色卖家 编辑:程序博客网 时间:2024/04/28 20:30

尝试自己动手在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}命令是相似的。




0 0