GCC工具源码编译

文章目录

背景

日常可能涉及到系统里自带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之间也有相互依赖。

  1. gmp编译

    cd gmp-6.1.0/

    ./configure --prefix=$(pwd)

    make & make install

    产出:libgmp.so

  2. 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路径>

  3. 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 编译

执行如下命令开始编译:

bash 复制代码
 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

bash 复制代码
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工具进行编译。


四、报错处理

  1. 编译过程可能有工具依赖相关的报错需要具体分析,但如果存在:sanitizer_common/sanitizer_internal_defs.h:xxx报错,需要屏蔽掉 configure 里的 target-libsanitizer这行再编译。
相关推荐
IC 见路不走24 分钟前
LeetCode 第91题:解码方法
linux·运维·服务器
翻滚吧键盘37 分钟前
查看linux中steam游戏的兼容性
linux·运维·游戏
小能喵42 分钟前
Kali Linux Wifi 伪造热点
linux·安全·kali·kali linux
汀沿河1 小时前
8.1 prefix Tunning与Prompt Tunning模型微调方法
linux·运维·服务器·人工智能
zly35001 小时前
centos7 ping127.0.0.1不通
linux·运维·服务器
小哥山水之间2 小时前
基于dropbear实现嵌入式系统ssh服务端与客户端完整交互
linux
ldj20202 小时前
2025 Centos 安装PostgreSQL
linux·postgresql·centos
翻滚吧键盘2 小时前
opensuse tumbleweed上安装显卡驱动
linux
cui_win3 小时前
【内存】Linux 内核优化实战 - net.ipv4.tcp_tw_reuse
linux·网络·tcp/ip
CodeWithMe6 小时前
【Note】《深入理解Linux内核》 Chapter 15 :深入理解 Linux 页缓存
linux·spring·缓存