本文是我源碼安裝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/
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$