gcc 工具鏈源碼安裝


本文是我源碼安裝GCC工具鏈的過程以及遇到的問題,希望能解決你遇到的問題。如果有什么問題, 請在本文下方評論, 或者發郵件至syyxy@outlook.com.  歡迎交流探討。

 

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    

  得到如下結果:

  yangxiaoyu@yangxiaoyu-HP-EliteBook-8460p:~/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.
  yangxiaoyu@yangxiaoyu-HP-EliteBook-8460p:~/sourceCode/gcc$ 

  mpfr_add_one_ulp  由  MPFR_ADD_ONE_ULP  定義而來, 於是繼續查找  MPFR_ADD_ONE_ULP  :

  yangxiaoyu@yangxiaoyu-HP-EliteBook-8460p:~/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));
  yangxiaoyu@yangxiaoyu-HP-EliteBook-8460p:~/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 

 

完成安裝!!

yangxiaoyu@yangxiaoyu-HP-EliteBook-8460p:~/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) 
yangxiaoyu@yangxiaoyu-HP-EliteBook-8460p:~/sourceCode/gcc/build$ 

 

 

 

 

   

  

   

 

   

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM