gcc 工具链源码安装

Posted syyxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc 工具链源码安装相关的知识,希望对你有一定的参考价值。

本文是我源码安装GCC工具链的过程以及遇到的问题,希望能解决你遇到的问题。如果有什么问题, 请在本文下方评论, 或者发邮件至[email protected]  欢迎交流探讨。

 

1)     

 svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc

  

2)   

  cd gcc; mkdir build

 

3)     

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

 

4)  执行configure 报如下错误:

  技术分享图片

缺少 GMP MPFR  MPC

5)http://www.multiprecision.org/mpc/download.html

     http://www.mpfr.org/mpfr-2.4.2/

     ftp://ftp.gnu.org/gnu/gmp

6)在一个新的目录下载解压上述文件

  

   wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.xz

   wget http://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.gz

   wget https://ftp.gnu.org/gnu/mpc/mpc-1.0.2.tar.gz

   xz -d gmp-6.1.1.tar.xz

   tar -zxvf mpc-1.0.2.tar.gz

   tar -zxvf mpfr-2.4.2.tar.gz

   tar -xvf gmp-6.1.1.tar

  

7)  在gcc 目录中创建 gmp,mpc,mpfr文件夹,然后将解压出的文件拷贝到其中(注意不要安装,直接拷贝)、

     

  mkdir gmp mpc mpfr

  cp -rf mpc-1.0.2/* /home/yangxiaoyu/sourceCode/gcc/mpc

  cp -rf mpfr-2.4.2/* /home/yangxiaoyu/sourceCode/gcc/mpfr

  cp -rf mp/* /home/yangxiaoyu/sourceCode/gcc/gmp/

  

8)    继续在build目录执行 :

   

  ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

  

       发现如下错误:

      技术分享图片

  mpfr 的版本必须是 必须 > 3.1.0,于是:

    

   wget http://www.mpfr.org/mpfr-current/mpfr-4.0.1.tar.gz

  

   将gcc/ mpfr目录下的文件删除,将新的解压出来拷贝进去。

 

9) 继续执行configure 遇到如下错误:

    技术分享图片

  安装m4

  

 wget http://ftp.gnu.org/gnu/m4/m4-1.4.16.tar.bz2

 tar -xjf m4-1.4.16.tar.bz2

 cd m4-1.4.16/

 cd build

 ../configure

make

sudo make install   

继续,

./configure过程中报 ./stdio.h:477:1: error: ‘gets‘ undeclared here (not in a function)

解决:

  

  vim  ./build/lib/stdio.h  +477

  

  使用

  

#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)

             _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");

  #endif

 

  替换:

  

_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");

 

 

  继续执行:../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib . 会在build目录生成Makefile

 

9)    然后在build 目录make -j4.

       会得到如下错误:

    技术分享图片

  这时需要安装 autoconf:

  

  sudo apt-get install autoconf

  

  然后执行:

  

  sudo autoreconf -ivf

  

  然后报错如下:

   技术分享图片

  需要 2.64 版本的 autoconf

  

  wget https://ftp.gnu.org/gnu/autoconf/autoconf-2.64.tar.bz2

  tar -xjf autoconf-2.64.tar.bz2

  mkdir build;cd build

  ../configure --prefix=/usr/bin/autoconf-2.64

  

  然后在gcc 目录(build 的上一级目录)执行:

  

  sudo /usr/bin/autoconf-2.64/bin/autoreconf -ivf

  

  切记不要在build目录执行该命令,会报错:

  

  autoreconf: `configure.ac‘ or `configure.in‘ is required

 

10) 继续 make, 报如下错误:

  技术分享图片

  打开文件发现 mul.c中的 mpfr_fmma 是static ,我将该函数改名字为 mpfr_fmma_mul

   继续编, 报错:

   技术分享图片

  安装 flex

  

  sudo apt-get install flex

  

  继续 make,

  报错如下: 

技术分享图片

  在 libmpc.a 中 缺少 mpfr_add_one_ulp 函数的实现, 首先在gcc 目录下查找 该定义:

  find *  -type f ! -name  "*.a"  ! -name  "*.o"    |xargs grep "mpfr_add_one_ulp" -s  -n    

  得到如下结果:

  [email protected]:~/sourceCode/gcc$  find *  -type f ! -name  "*.a"  ! -name  "*.o"    |xargs grep "mpfr_add_one_ulp" -s  -n
  mpc/src/mpc-impl.h:63:#define MPFR_ADD_ONE_ULP(x) mpfr_add_one_ulp (x, GMP_RNDN)
  mpfr/NEWS:100:- Old, deprecated macros mpfr_add_one_ulp and 
  mpfr_sub_one_ulp removed.
  mpfr/NEWS:157:- The mpfr_add_one_ulp and mpfr_sub_one_ulp macros (which are obsolete and
  匹配到二进制文件 mpfr/doc/mpfr.info
  mpfr/doc/mpfr.texi:4210:Macros @code{mpfr_add_one_ulp} and @code{mpfr_sub_one_ulp} have been
  mpfr/ChangeLog:2949:Old, deprecated macros mpfr_add_one_ulp and mpfr_sub_one_ulp removed.
  mpfr/ChangeLog:33791:[NEWS] inform the users that mpfr_add_one_ulp and mpfr_sub_one_ulp will be
  mpfr/ChangeLog:61048:Remove mpfr_add_one_ulp from MPFR library.
  mpfr/ChangeLog:79585:mpfr_add_one_ulp and mpfr_sub_one_ulp changed.
  [email protected]:~/sourceCode/gcc$ 

  mpfr_add_one_ulp  由  MPFR_ADD_ONE_ULP  定义而来, 于是继续查找  MPFR_ADD_ONE_ULP  :

  [email protected]:~/sourceCode/gcc$ find *  -type f ! -name  "*.a"  ! -name  "*.o"    |xargs grep "MPFR_ADD_ONE_ULP" -s  -n                  
  mpc/src/tan.c:197:      MPFR_ADD_ONE_ULP (mpc_realref (x));
  mpc/src/tan.c:198:      MPFR_ADD_ONE_ULP (mpc_imagref (x));
  mpc/src/tan.c:199:      MPFR_ADD_ONE_ULP (mpc_realref (y));
  mpc/src/tan.c:200:      MPFR_ADD_ONE_ULP (mpc_imagref (y));
  mpc/src/tan.c:250:         MPFR_ADD_ONE_ULP (mpc_realref (x));
  mpc/src/tan.c:252:         MPFR_ADD_ONE_ULP (mpc_imagref (x));
  mpc/src/mpc-impl.h:63:#define MPFR_ADD_ONE_ULP(x) mpfr_add_one_ulp (x, GMP_RNDN)
  mpc/src/mpc-impl.h:84:   ((f) ? MPFR_ADD_ONE_ULP (rop), MPFR_SIGNBIT (rop) : 0)
  mpc/src/sqrt.c:293:               MPFR_ADD_ONE_ULP (mpc_realref (a));
  mpc/src/sqrt.c:301:               MPFR_ADD_ONE_ULP (mpc_imagref (a));
  mpc/src/sqrt.c:309:               MPFR_ADD_ONE_ULP (mpc_imagref (a));
  [email protected]:~/sourceCode/gcc$ 

  发现并没有  MPFR_ADD_ONE_ULP   的实现,于是百度该函数发现  http://www.mpfr.org/mpfr-current/mpfr.html 告诉我们:

     技术分享图片

  之前在 8) 中, mpfr 的版本必须大于3.1.0.  因此这里看起来只能修改mpc的版本。 将  http://www.multiprecision.org/mpc/download.html 所有的版本(截止到现在最新版本为 1.0.3)下载下来,  所有的版本都调用了  mpfr_add_one_ulp  , 这就自相矛盾了。  我这边在 mpfr-2.4.2 版本的 mpfr.h 中发现了该宏的定义 :   

#define mpfr_add_one_ulp(x,r) \\
 (mpfr_sgn (x) > 0 ? mpfr_nextabove (x) : mpfr_nextbelow (x))
#define mpfr_sub_one_ulp(x,r) \\
 (mpfr_sgn (x) > 0 ? mpfr_nextbelow (x) : mpfr_nextabove (x))

 

     将其拷贝到gcc/mpfr/mpfr.h 中。

    

然后继续make 

.

..

.

.

.

超长时间的编译

.

.

.

.

make 完成后,

sudo make install 

 

完成安装!!

[email protected]:~/sourceCode/gcc/build$ gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i686-pc-linux-gnu/8.0.1/lto-wrapper
目标:i686-pc-linux-gnu
配置为:../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
线程模型:posix
gcc 版本 8.0.1 20180409 (experimental) (GCC) 
[email protected]-HP-EliteBook-8460p:~/sourceCode/gcc/build$ 

 

 

 

 

   

  

   

 

   

 

 





以上是关于gcc 工具链源码安装的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 编译 ARM-Linux-Gcc 工具链 -- 安装crosstool-NG

gcc 9.2 交叉工具链构建过程

LINUX交叉编译工具链和GCC是啥关系啊

aarch64-linux-gnu-gcc 交叉编译工具链安装演示

MSYS2 - 安装 gcc 或工具链?

嵌入式Linux5.Ubuntu 交叉编译工具链安装