在MSYS2+MinGW环境下编译arm-none-eabi工具链

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq446252221/article/details/76922154

前言

在Windows平台有MSYS2这个非常好用的linux模拟环境,支持大量的linux实用工具,如:busybox, grep, find, sed, awk, perl, gcc等等. 虽然MSYS2平台也提供了gcc编译器,但它的gcc工具链是i686-pc-msys,也就是说它编译出来的代码是基于MSYS的运行时环境, 而不是原生的Windows运行时(MSVCRT),所以为了编译Windows平台运行的EXE程序,还是使用MINGW提供的GCC比较好。

目的
MSYS和MINGW都提供了各自的gcc工具链,但是没有arm平台的交叉编译环境,所以自己尝试编译一个单纯的arm-none-eabi工具链。

正文
在MSYS+MINGW环境下编译gcc和在linux系统编译过程大体相同,
编译顺序也是这样的:gmp -> mpfr -> mpc ->binutils -> gcc (-> glibc -> binutils -> gcc)。
注意:不要用太新的GCC版本编译太旧的GCC源码,我之前用GCC6.3编译4.8版本的源码失败了。
我现在测试使用的是GCC5.10, 编译的源码版本为4.8.5。

1.编译gmp, mpfr, mpc

#../configure --disable-shared --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/opt/mingw
#make
#make install

编译过程都比较顺利
host 指定运行这个库的环境是mingw32
build 指定编译这个源码的环境是mingw32
可能会出现找不到gmp.h的问题,那就添加一个参数:–with-gmp=/opt/mingw
这里不能用动态链接,所以要–disable-shared

2.编译binutils

#../configure --disable-shared --disable-nls --disable-multilib --host=i686-pc-mingw32 --build=i686-pc-mingw32 --target=arm-none-eabi --prefix=/opt/arm
# make
# make install

这个编译过程也比较顺利,可能出现的问题问题同上。

3.编译gcc:

#../configure --enable-targets=all --enable-languages=c --disable-shared --disable-checking --disable-threads --disable-multilib --disable-nls  --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-bootstrap --disable-libquadmath --disable-libatomic  --without-headers --with-newlib
--host=i686-pc-mingw32 --build=i686-pc-mingw32 --target=arm-none-eabi
#make -j2
#make install

编译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添加到环境变量中。

猜你喜欢

转载自blog.csdn.net/qq446252221/article/details/76922154