前言
在Windows平台有MSYS2这个非常好用的linux模拟环境,支持大量的linux实用工具。
如:busybox, grep, find, sed, awk, perl, gcc, make等等.
虽然MSYS2平台也提供了gcc编译器,但它的gcc工具链是i686-pc-msys,
也就是说它编译出来的可执行文件是基于MSYS2的运行时环境,需要msys.dll才能运行。
而不是原生的Windows运行时(MSVCRT),所以为了编译Windows平台运行的EXE程序,
还是使用MINGW提供的GCC比较好。
目的
MSYS2和MINGW都提供了各自的gcc工具链,但是没有arm平台的交叉编译环境,
所以自己尝试编译一个单纯的arm-none-eabi工具链。
正文
在MSYS2+MINGW环境下编译gcc和在linux系统编译过程大体相同,
编译顺序也是这样的:gmp -> mpfr -> mpc ->binutils -> gcc (-> glibc/newlib/uclibc)。
注意:
不要用太新的GCC版本编译太旧的GCC源码,我之前用GCC6.3编译4.8版本的源码失败了。
我现在测试使用的是GCC5.10, 编译的源码版本为4.8.5。
编译时,最好在源码目录下执行:
#mkdir build
#cd build
#../configure
这样不会污染源码目录。
1.编译gmp, mpfr, mpc
#../configure --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/opt/mingw --disable-shared
#make
#make install
或者
#make install-strip
编译过程都比较顺利,此过程需要MSYS2有m4、awk、grep命令。
--host 指定运行这个库的环境是mingw32
--build 指定编译这个源码的环境是mingw32
可能会出现找不到gmp.h的问题,那就添加一个参数:--with-gmp=/opt/mingw
这里不能用动态链接,所以要--disable-shared
2.编译binutils
#../configure --host=i686-pc-mingw32 --build=i686-pc-mingw32 \
--target=arm-none-eabi --prefix=/opt/arm \
--disable-shared --disable-nls --disable-multilib
#make CFLAGS="xxx"(这里可以自定义编译选项)
#make install
#make install-strip(推荐)
这个编译过程也比较顺利,一般不会有什么问题。
3.编译gcc:
下面是编译arm-none-eabi的参考配置:
#../configure --target=arm-none-eabi --build=i686-pc-mingw32 --prefix=/mingw32 \
--disable-shared --disable-nls --disable-bootstrap \
--disable-multilib --disable-libquadmath --disable-libssp --disable-libgomp \
--disable-libatomic --disable-libffi --disable-libmudflap --disable-decimal-float \
--disable-lto --disable-threads --disable-tls \
--enable-languages=c
#make -j2 CFLAGS="xxx"
#make install-strip
如果要编译mingw32平台的gcc可以参考下面的配置选项:
#../configure --target=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/mingw32 \
--disable-shared --disable-nls --disable-bootstrap \
--disable-multilib --disable-libquadmath --disable-libssp --disable-libgomp \
--disable-libatomic --disable-libffi --disable-libmudflap --disable-decimal-float \
--disable-lto --enable-threads=win32 --disable-win32-registry \
--enable-languages=c,c++
编译gcc非常慢,而且还出了几个问题,在此记录:
1. 出现texi编译错误
因为我的MSYS没有安装texinfo这个软件包,安装5.2版本后编译通过;
2.编译libgcc的时候出错,提示xgcc.exe CreateProcess failed.........
这个问题纠结了很久,因为xgcc调用自己的as是一个脚本文件,而Win32API CreateProcess是不可能运行一个脚本程序的,所以提示这个错误;
解决办法就是把之前编译好的arm-none-eabi下面的as.exe复制过来,然后把arm-none-eabi添加到环境变量中。
3.编译出错之后,可以查看config.log,里面记录了出错的原因,一般是缺少文件造成的。