在Windows系统上使用GCC编译器有两类途径,一个是MingW,另一个是Cygwin,MingW的原则是开发的程序直接调用Win32 API,而Cygwin的原则是将Win32API转化为POSIX接口,程序调用POSIX接口,这种做法互有利弊,MingW开发的程序在Windows上效率也是很高的,而Cygwin的则显得臃肿,但是Cygwin开发的程序很容易移植到Linux等POSIX系统,基于POSIX的程序也很容易通过Cygwin在Windows上实现。随着开源技术的发展,Cygwin中也有版本比较老的MingW工具链。
MingW类似的项目也有TDM-GCC,包括MinGW64 的项目也在发展中,但如果要使用GCC源码构建MinGW建议使用官方网站的MinGW http://www.mingw.org/ 使用非官方网站的MinGW发行版本还要进行一些修改,工具替换,比较麻烦比如:
1.SED.exe stream editor 有些版本未必能够很好的在Windows上使用,常常容易出现字符串解析错误的情况,比如,使用 nuwen.net的MinGW发行版本 configure时就出现解析错误。
2.MSYS 很多Mingw发行版本并没有MSYS,或者没有单独的将MSYS目录独立出来模拟Linux环境, 特别在编译GCC的时候就显得不足,configure脚本要执行必须使用 #!/bin/sh 来执行。
3.官方的mingw-get-inst-xxxx.exe程序能够帮助使用者很简单的就配置好Mingw。
下载MinGW程序 安装到分区根目录下一般是 C:\MinGW 或者 D:\MinGW
记得勾选所有的工具 不然安装时很麻烦
下载Mintty 安装到msys/1.0/bin目录下建立快捷方式,有的版本可能默认安装了Mintty。这个很有用的。
所以编译GCC我的建议使用官方的Mingw
那么我们就要来开始构建自己的Mingw。
我说一下 为什么要构建自己的Mingw,原因:官方的Mingw编译的C++程序,默认需要Libstdc++的动态库,需要强制使用-static,某些项目强制使用--disable-shared --enable-static无效, 另外还要自己尝试一下编译GCC,以期锻炼自己的能力
好吧 言归正传,接下来就是编译GCC的步骤
下载最新源代码:ftp://ftp.gnu.org/gnu/gcc/ 目前版本是GCC 4.8.0 日期是 2012年9月20日 解压到一个硬盘可用空间超过4G的分区,建议用7z。
先准备必要的库,GMP,MPC,MPFR,可以自己编译,顺序是 先GMP,最后MPC ,这三个库在MinGW (GCC 4.8.0)都能编译成功。这三个库分别是多精度运算,任意高精度运算,多精度浮点运算。其他依赖的库一般MinGW都已经安装,记得安装后配置到MingW/lib include,而不是MSYS的lib,local/lib 等
这些库 都是先解压到一个新目录,建议目录全路径不要太长。解压后运行Mintty跳转到解压文件的目录
./configure --prefix=/mingw &&make &&make install
如果你只是安装在local目录就--prefix=/usr/local,当然这些目录系统是会识别的。其他目录在编译GCC的时候就必须指定 如:--with-gmp=/c/temp/gcc/gmp
这些都配置好了就开始编译GCC了,进入GCC的源码目录
./configure --enable-languages=c,c++,objc,fortran,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --disable-shared --enable-static --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --disable-libstdcxx-pch --disable-build-poststage1-with-cxx --build=mingw32 --prefix=/mingw --enable-lto
--enable-languages 代表支持的语言,一般不建议添加Ada,原因是添加Ada会编译错误,需要额外的库才能编译Ada(gnat+lib)--disable-sjlj-exceptions 不使用sjlj异常处理,--with-dwarf2 DWARF2也是一种异常处理,--disable-shared --enable-static C/C++运行时库使用静态链接不使用动态链接, --disable-build-poststage1-with-cxx stage1不使用C++编译,--build=mingw32 使用mingw32编译 --prefix=/mingw 确认GCC的默认安装位置。
接下来是make,等待很久,至少两三个小时,基本上就编译成功了。
如果要替换掉老的版本就make install 如果你不想安装在老版本的目录,在configure阶段,请修改 --prefix=/"你的目录"。
特别的GCC原来使用C编写的,只能使用C编译器,这几年GCC准备使用C++来实现GCC,所以现在的代码都可以用C++编译器编译,一般就是C++ ,如果你要使用来编译的话,请添加--enable-build-with-cxx 一般而言GCC是一种自举的编译器,先用旧版本的编译器编译生成新版本的编译器,你会发生是xgcc xg++,再来用生成的编译器编译自身源代码,最后安装的时候改名gcc g++
如果你一步一步的做,基本上编译GCC不会出现错误 ,GCC4.8.0已经发布,如果你想试一下,我建议你自己下载源代码 按照步骤一步一步的构建自己的Mingw
静态编译和动态编译的问题:
第一,静态编译的程序,C++程序体积很大
第二,动态编译的程序,必须依赖运行时库。
如果有更多地疑问,请留言