[文件头]
GCC 4.7.0源代码:ftp://gcc.gnu.org/pub/gcc/releases/。
编译环境:MinGW 4.6.2(完全安装):http://sourceforge.net/projects/mingw/。
安装后使用%MinGW%\msys\1.0\msys.bat环境编译。
整个过程需要大约4G的可用磁盘空间。
[环境配置]
新建/mingw470、/mingwlibs,其中/mingw470是存放我们新生成的MinGW,/mingwlibs是一些GCC依赖的dll等。
修改etc/profile,将
if [ $MSYSTEM == MINGW32 ]; then
export PATH=".:/usr/local/bin:/mingw/bin:/bin:$PATH"
else
export PATH=".:/usr/local/bin:/bin:/mingw/bin:$PATH"
fi修改为if [ $MSYSTEM == MINGW32 ]; then
export PATH=".:/mingwlibs/bin:/mingw470/bin:/usr/local/bin:/mingw/bin:/bin:$PATH"
else
export PATH=".:/mingwlibs/bin:/mingw470/bin:/usr/local/bin:/bin:/mingw/bin:$PATH"
fi
这儿我们把我们自己的bin目录们放在了系统(以及MinGW)的bin目录前面,这个主要是因为我们的bin目录会包括新生成的一些dll,某些dll(比如gmp的)会跟系统(或MinGW)自带的dll冲突,这种情况下我们需要使用我们新生成的dll,所以要把我们的bin放在系统的bin之前。
在/etc/profile最后的cd “$HOME”之前加上以下内容。
export CFLAGS="-O2 -fomit-frame-pointer -fno-exceptions -I/mingw470/include"
export CXXFLAGS="-O2 -fomit-frame-pointer -mthreads -m128bit-long-double -I/mingw470/include"
export LDFLAGS="-s -L/mingw470/lib"
这个是编译器们的参数,主要是优化编译结果、包含的头文件和库之类的。
[编译依赖项]
下载以下库并解压到/home/$UserName($UserName为当前登陆的用户名,即用户主目录,如果找不到/home/$UserName,请先运行msys.bat,会自动创建/home/$UserName。),这些库是GCC的依赖项。
- gmp:版本5.0.4,http://gmplib.org/。
- mpfr:版本3.1.0,http://www.mpfr.org/mpfr-current/#download。
- mpc:版本0.8.2,http://www.multiprecision.org/index.php?prog=mpc&page=download。
依次编译(并安装,下同)gmp、mpfr、mpc,其中mpfr依赖于gmp,mpc依赖于mpfr。
- 编译(确切来说是配置)mpc时可能会提示找不到GMP或者ABI不匹配,这是mpc自带的configure跟GCC的不兼容导致的(可能是mpc的configure写的不规范。),参考https://newbiecoder.0ginr.com/blog/?p=245。
- gmp在make install之后还可以make check一下。(按照gmp的提示是说编译器可能会有BUG,check可以验证一下编译结果的正确性。)
gmp
configure --enable-shared --disable-static --enable-cxx --prefix=/mingwlibs --host=i686-pc-mingw32 && make && make install
mpfr
configure --enable-shared --disable-static --with-gmp=/mingwlibs --prefix=/mingwlibs --host=i686-pc-mingw32 && make && make install
mpc
configure --enable-shared --disable-static --with-gmp=/mingwlibs --with-mpfr=/mingwlibs --prefix=/mingwlibs --host=i686-pc-mingw32 && make && make install
在上面3个库全部编译完成后,就可以编译GCC了。
[编译GCC]
在编译GCC之前,需要修改/mingwlibs/include/mpc.h,在行#131之前添加:
#undef __MPC_DECLSPEC
#define __MPC_DECLSPEC extern
否则可能会提示gmp/mpfr/mpc版本不正确。实际上是mpc.h中__MPC_DECLSPEC的定义有问题(好像定义成了dllimport,但是mpc的.a文件跟这个.h对不上。),这可能是mpc的一个BUG。
然后将gcc解压到/home/$UserName并编译。
- 如果只需要C/C++编译器可以增加参数“–enable-languages=c,c++”。
- GCC编译过程中分3个阶段。第一阶段是用当前系统中的编译器(通常是老版本GCC)编译新的GCC,第二阶段是用新编译出来的GCC再编译一次自己,这时候如果不存在BUG的话,产生出来的结果就应该是最终结果了,第三阶段是第二阶段产生的GCC再编译自己,这次的结果是用来和第二阶段的结果对比的,来验证编译结果的正确性的,如果不想要这个验证,可以增加参数“–disable-bootstrap”来关闭它,这样可以快不少。
gcc
configure --enable-nls --enable-shared --enable-static --enable-libgomp --enable-version-specific-runtime-libs --enable-lto --enable-threads=win32 --enable-cloog-backend=isl --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-pch --with-dwarf2 --with-mpc=/mingwlibs --with-mpfr=/mingwlibs --with-gmp=/mingwlibs --without-x --prefix=/mingw470 --host=i686-pc-mingw32 && make && make install
[安装辅助库]
从MinGW处下载w32api(3.17)、mingw-rt(3.20)、libiconv(1.14)、pthreads-w32(2.8.0)、binutils(2.22,源代码)、libintl(0.18.1.1,位于下载网页中的gettext目录下):http://sourceforge.net/projects/mingw/files/MinGW/Base/,这些库(及代码等)用于帮助构造完整的最终编译环境。
将w32api、mingw-rt、libiconv、pthreads-w32、libintl解压到/mingw470。
- 官方版发布的二进制版本的binutils是静态链接gmp/mpfr/mpc的,为使其动态链接,需要下载其源代码,然后解压到/home/$UserName并编译。如果不想自行编译也可以直接下载官方发布的二进制版本的binutils然后解压到/mingw470。
binutils
configure --enable-shared --disable-static --with-cloog-backend=isl --enable-nls --with-mpc=/mingwlibs --with-mpfr=/mingwlibs --with-gmp=/mingwlibs --prefix=/mingw470 --host=i686-pc-mingw32 && make && make install
待编译完成后即可关闭msys。
[合并]
将/mingwlibs/bin下的所有文件复制到/mingw470/bin即可。
[删除调试信息]
编译完成后可能会发现文件都非常大(比如/mingw470/libexec/gcc/i686-pc-mingw32/4.7.0/cc1.exe就有70M。),这是因为其中包含了调试信息等信息,使用strip工具可以将这些信息删除掉。
将/mingw470下的所有文件复制到新目录(比如F:\MinGW32_470。),将/mingwlibs/bin下的所有文件复制到新目录下的\bin(比如F:\MinGW32_470\bin)。
打开命令提示符,进入这个目录,执行以下命令。
copy bin\strip.exe strip.exe
set path=.\bin;%path%
for /r %f in (*.exe, *.dll) do strip.exe --strip-all %f
for /r %f in (*.a) do strip.exe --strip-debug --strip-unneeded %f
del strip.exe
[其他]
如果需要一个批处理来设置环境变量的话,直接用TDM-GCC带的mingwvars.bat即可。
@echo.
@echo Setting up environment for using MinGW with GCC from %~dp0.
@set PATH=%~dp0bin;%PATH%
另外,虽然辅助库是GCC 4.7.0编译出来的,但是之前的gmp等库都是由GCC 4.6.2编译的,如果有必要的话可以现在用GCC 4.7.0从头再来一次,不过只需要编译这些依赖项,不需要再编译GCC本身。
[参考]
[1] http://gcc.gnu.org/install/prerequisites.html
[2] http://www.aristeia.com/Misc/gcc4ForWindows.html
[3] http://blogs.ejb.cc/archives/1339/use-mingw64-compile-gcc-4-6-and-4-7
发表回复