最佳實踐 | 原始碼升級gcc

馬明召發表於2019-01-17

1、下載升級包所需軟體

boost_1_60_0.tar.gz     http://www.boost.org/users/history/version_1_60_0.html

gcc-4.8.0.tar.gz        http://ftp.gnu.org/gnu/gcc/gcc-4.8.0/            必須

isl-0.11.1.tar.gz       http://isl.gforge.inria.fr/                      必須

mpc-1.0.3.tar.gz        http://ftp.heanet.ie/mirrors/gnu/mpc/            必須

cloog-0.18.1.tar.gz     ftp://gcc.gnu.org/pub/gcc/infrastructure/        必須

gmp-5.1.3.tar.gz        http://ftp.yz.yamagata-u.ac.jp/pub/GNU/gmp/      必須

libelf-0.8.13.tar.gz    http://www.mr511.de/software/english.html        必須     

mpfr-3.1.3.tar.gz       http://ftp.gnu.org/gnu/mpfr/                     必須

2、依次安裝相關的軟體

  • Gmp
  tar -jxvf gmp-6.1.0.tar.bz2
  cd gmp-6.1.0
  ./configure  --prefix=/usr/local/gmp
  make -j 4 && make install && echo $?
  • Mpfr
  tar -zxvf mpfr-3.1.3.tar.gz
  cd mpfr-3.1.3
  ./configure --with-gmp-include=/usr/local/gmp/include 
    --with-gmp-lib=/usr/local/gmp/lib 
    --prefix=/usr/local/mpfr
  make -j 4 && make install && echo $?
  • Mpc
  tar -zxvf mpc-1.0.3.tar.gz
  cd mpc-1.0.3
  ./configure --with-mpfr-include=/usr/local/mpfr/include 
    --with-mpfr-lib=/usr/local/mpfr/lib 
    --with-gmp-include=/usr/local/gmp/include 
    --with-gmp-lib=/usr/local/gmp/lib 
    --prefix=/usr/local/mpc
   make -j 4 && make install && echo $?
  • Isl
  tar -zxvf isl-0.11.tar.gz
  cd isl-0.11
  ./configure --with-gmp-prefix=/usr/local/gmp --prefix=/usr/local/isl
  make -j 4 && make install && echo $?
  • Cloog
  tar -zxvf cloog-0.18.0.tar.gz
  cd cloog-0.18.0
  ./configure --with-gmp-prefix=/usr/local/gmp 
    --with-isl-prefix=/usr/local/isl  
    --prefix=/usr/local/cloog
  make -j 4 && make install && echo $?
  • Gcc
  tar -zxvf gcc-4.8.0.tar.gz
  cd gcc-4.8.0
  編譯安裝gcc是需要指定各個依賴庫的檔案目錄
  vi /etc/ld.so.conf

   /usr/local/isl/lib
   /usr/local/cloog/lib
   /usr/local/mpc/lib
   /usr/local/mpfr/lib
   /usr/local/gmp/lib
  儲存、退出後執行命令 ldconfig

  ./configure 
     --with-mpfr=/usr/local/mpfr 
     --with-gmp=/usr/local/gmp 
     --with-mpc=/usr/local/mpc 
     --with-mpfr-include=/usr/local/mpfr/include 
     --with-mpfr-lib=/usr/local/mpfr/lib 
     --with-gmp-lib=/usr/local/gmp/lib 
     --with-gmp-include=/usr/local/gmp/include 
     --with-mpc-lib=/usr/local/mpc/lib 
     --with-mpc-inclue=/usr/local/mpc/include 
     --with-isl-include=/usr/local/isl/include 
     --with-isl-lib=/usr/local/isl/lib/ 
     --with-cloog-include=/usr/local/cloog/include 
     --with-cloog-lib=/usr/local/cloog/lib 
     --enable-languages=c,c++,objc,fortran,obj-c++,java 
     --enable-threads=posix 
     --disable-multilib 
     --with-pkgversion=`SUSE Linux`

  make -j 4 && make install && echo $?

3、驗證

  gcc -v

4、報錯解決

 1)解壓gcc安裝包直接編譯

   錯誤資訊:
   configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify their locatio
   錯誤原因:
   對gcc原始碼編譯安裝,需要GMP 4.2+,MPFR 2.4.0+ and MPC 0.8.0+的事先安裝,如果檢測不到預設標頭檔案和庫檔案裡存在上述安裝包檔案,則會報錯。
   解決方案:
   通過安裝gmp,mpfr,mpc安裝包,並指定其庫檔案路徑進行編譯gcc即可,具體版本和安裝步驟詳細參考上述安裝步驟。
   安裝gmp,mpfr,mpc後執行下面編譯指令碼進行編譯
   ./configure --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp --with-mpc=/usr/local/mpc   --with-mpfr-include=/usr/local/mpfr/include --with-mpfr-lib=/usr/local/mpfr/lib --with-gmp-lib=/usr/local/gmp/lib --with-gmp-include=/usr/local/gmp/include --with-mpc-lib=/usr/local/mpc/lib --with-mpc-inclue=/usr/local/mpc/include --enable-languages=c,c++ --enable-threads=posix --disable-multilib

2)編譯mpc安裝包出錯
   錯誤資訊:
   /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libmpfr.a: could not read symbols: Bad value
   collect2: ld returned 1 exit status
   make[2]: *** [libmpc.la] Error 1
   make[2]: Leaving directory `/tools/PXC/gcc/mpc-1.0.3/src`
   make[1]: *** [all-recursive] Error 1
   make[1]: Leaving directory `/tools/PXC/gcc/mpc-1.0.3`
   make: *** [all] Error 2
   錯誤原因:
   編譯mpc原始碼時,沒有指定gmp、mpfr對應的安裝路徑(主要是庫檔案和標頭檔案路徑)
   解決方案:
   在編譯指令碼里加入相應的gmp、mpfr安裝路徑或者庫檔案+標頭檔案路徑
   ./configure --with-mpfr-include=/usr/local/mpfr/include  --with-mpfr-lib=/usr/local/mpfr/lib --with-gmp-include=/usr/local/gmp/include --with-gmp-lib=/usr/local/gmp/lib --prefix=/usr/local/mpc  
    或者
    ./configure --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp --prefix=/usr/local/mpc

3)帶gmp、mpfr、mpc編譯引數,編譯gcc原始碼出錯
   錯誤資訊:
   conftest.c:10:25: error: isl/version.h: No such file or directory
   錯誤原因:
   沒安裝isl安裝包
   解決方案:
   安裝isl-0.11.1.tar.gz,具體安裝步驟參照上面內容。

4)原始碼編譯isl出錯
   錯誤資訊:
   ./.libs/libisl.so: undefined reference to `__gmp_get_memory_functions`
   collect2: ld returned 1 exit status
   make[2]: *** [isl_cat] Error 1
   ./.libs/libisl.so: undefined reference to `__gmp_get_memory_functions`
   collect2: ld returned 1 exit status
   make[2]: *** [isl_polyhedron_detect_equalities] Error 1
   make[2]: Leaving directory `/tools/PXC/gcc/isl-0.12.2`
   make[1]: *** [all-recursive] Error 1
   make[1]: Leaving directory `/tools/PXC/gcc/isl-0.12.2`
   make: *** [all] Error 2
   錯誤原因:
   isl編譯安裝,需要在指定gmp的安裝路徑
   解決方案:
   在編譯引數裡指定gmp的安裝路徑,並且格式為--with-gmp-prefix==,不能用--with-gmp
   ./configure    --with-gmp-prefix=/usr/local/gmp --prefix=/usr/local/isl
   參考檔案:https://groups.google.com/forum/#!msg/isl-development/ejZLCmty4Nc/PrKXb9noTCoJ

5)安裝完gmp,mpfr,mpc,isl後,原始碼編譯gcc出錯
   錯誤資訊:
   configure:6098: gcc -c -g -O2 -DCLOOG_INT_GMP  -I/usr/local/isl/include -I/usr/local/gmp/include -I/usr/local/mpfr/include -I/usr/local/mpc/include   conftest.c >&5
   conftest.c:10:27: error: cloog/version.h: No such file or directory
   conftest.c: In function `main`:
   conftest.c:15: error: `choke` undeclared (first use in this function)
   conftest.c:15: error: (Each undeclared identifier is reported only once
   conftest.c:15: error: for each function it appears in.)
   conftest.c:15: error: expected `;` before `me`
   錯誤原因:
   缺少安裝包cloog,沒找到相應的庫檔案。
   解決方案:
   安裝cloog-0.18.1.tar.gz ,具體安裝步驟參照上面安裝步驟,安裝cloog後,繼續編譯gcc
   ./configure --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp --with-mpc=/usr/local/mpc   --with-mpfr-include=/usr/local/mpfr/include --with-mpfr-lib=/usr/local/mpfr/lib --with-gmp-lib=/usr/local/gmp/lib --with-gmp-include=/usr/local/gmp/include --with-mpc-lib=/usr/local/mpc/lib --with-mpc-inclue=/usr/local/mpc/include  --with-isl-include=/usr/local/isl/include --with-isl-lib=/usr/local/isl/lib/ --with-cloog-include=/usr/local/cloog/include --with-cloog-lib=/usr/local/cloog/lib --enable-languages=c,c++ --enable-threads=posix --disable-multilib --disable-bootstrap --disable-libstdcxx-pch

6)安裝cloog遇到下屬錯誤
   錯誤資訊:
   ./conftest: error while loading shared libraries: libisl.so.10: cannot open shared object file: No such file or directory
   錯誤原因:
   找不到isl的庫檔案,需要在/etc/ld.so.conf中新增以下內容/usr/local/isl/lib,並通過ldconfig使其生效。
   解決方案:
   通過LD_LIBRARY_PATH指定isl庫檔案路徑或者在/etc/ld.so.conf中新增以下內容/usr/local/isl/lib,並通過ldconfig使其生效。然後通過相應的編輯引數指定isl的庫檔案和標頭檔案,進行cloog編譯安裝。通過strings /etc/ld.so.cache | grep libisl  檢視是否已經將庫檔案寫入快取。

7)下屬錯誤可以忽略
   錯誤資訊01:
   conftest.cpp:11:2: error: #error -static-libstdc++ not implemented

8)下屬錯誤可以忽略
  錯誤資訊:
  ldconfig: /usr/local/isl/lib/libisl.so.10.1.0-gdb.py is not an ELF file - it   has the wrong magic bytes at the start.
  錯誤原因:
  /usr/local/isl/lib/libisl.so.10.1.0-gdb.py 檔案型別錯誤
  解決方案:
  rm /usr/local/isl/lib/libisl.so.10.1.0-gdb.py

5、參考文件

http://stackoverflow.com/questions/9450394/how-to-install-gcc-piece-by-piece-with-gmp-mpfr-mpc-elf-without-shared-libra
https://groups.google.com/forum/#!msg/isl-development/ejZLCmty4Nc/PrKXb9noTCoJ

相關文章