文章目录
- 背景
- 一、下载源码
- 二、编译前依赖准备
- 2.1 相关工具依赖
- 2.2 相关lib(gmp/ mpfr /mpc)依赖
- 2.2.1 lib源码下载
- 2.2.2 lib源码编译
- 三、编译GCC
- 3.1 编译
- 3.2 链接
- 四、报错处理
背景
日常可能涉及到系统里自带GCC版本与被编译源码存在不兼容,或者需要对GCC需要做一些定制化修改,因此需要通过源码编译出GCC工具的场景。
一、下载源码
下载地址:从清华源下载源码会快一些。
本文编译gcc目标工具为8.3.0版本,系统自带gcc工具为11.4版本需要被替换。
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz
二、编译前依赖准备
2.1 相关工具依赖
编译过程会涉及到一些工具的使用,需要看本机系统是否具备这些工具,如下是编译过程遇到需要相关工具需要必须被安装,具体需要看读者自己系统环境,见招拆招。
sudo apt install m4
sudo apt install libtool-bin
sudo apt install g++
sudo apt install gpp
2.2 相关lib(gmp/ mpfr /mpc)依赖
GCC编译过程会对这三个库有依赖:gmp
, mpfr
, mpc
,否则编译过程会报错。
2.2.1 lib源码下载
从如下3个链接获取gmp
, mpfr
, mpc
源码:
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
2.2.2 lib源码编译
安装过程要注意先后顺序,因为lib之间也有相互依赖。
-
gmp编译
cd gmp-6.1.0/
./configure --prefix=$(pwd)
make & make install产出:libgmp.so
-
mpfr编译
mpfr会依赖到gmp的库。cd mpfr-3.1.4/
./configure --prefix=$(pwd)
make & make install生成:
libmpfr.so / libmpfr.a 位于lib下
头文件位于include下如果过程如有报gmp的依赖报错,需要后加入依赖路径:
–with-gmp-include=<gmp的头文件路径>
–with-gmp-lib=<gmp的lib路径> -
mpc编译
cd mpc-1.0.3/
./configure --prefix=$(pwd)
make
make install编译过程如有报mpfr的依赖报错,需要后加入依赖路径:
–with-mpfr-include=<mpfr的头文件路径>
–with-mpfr-lib=<mpfr的lib路径>
三、编译GCC
3.1 编译
执行如下命令开始编译:
mkdir -p /usr/local/gcc-8.3.0 #存放编译产出
cp mpfr-3.1.4/lib/libmpfr.so* /usr/lib/ #libmpfr库在日常编译会被依赖
./configure --prefix=/usr/local/gcc-8.3.0 #指定产出路径
--disable-multilib
--with-gmp=<gmp-6.1.0 路径>
--with-mpfr=<mpfr-3.1.4 路径>
--with-mpc=<mpc-1.0.3 路径>
make -j 16 # 16核同时编译
make install
编译时间会比较久,耐心等待…
编译完成在/usr/local/gcc-8.3.0/bin下生成gcc工具
/usr/local/gcc-8.3.0/bin/gcc -v
可以查看版本
3.2 链接
由于gcc工具在/usr/local/gcc-8.3.0/bin下,需要创建软链接,将系统gcc默认指向/usr/local/gcc-8.3.0/bin/gcc
。
which gcc #查看gcc路径。如果在/usr/bin/gcc且是个软链接
rm /usr/bin/gcc #删除原软链接
ln -s /usr/local/gcc-8.3.0/bin/gcc /usr/bin/gcc #重新建立软链接
这样就可以正常使用gcc做其他源码编译了。如果是要交叉编译arm gcc,流程也跟上面类似,只是编译工具用arm工具进行编译。
四、报错处理
- 编译过程可能有工具依赖相关的报错需要具体分析,但如果存在:
sanitizer_common/sanitizer_internal_defs.h:xxx
报错,需要屏蔽掉 configure 里的target-libsanitizer
这行再编译。