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

前言


在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,里面记录了出错的原因,一般是缺少文件造成的。


                
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值