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这行再编译。
相关推荐
星恒随风11 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
唐墨12316 小时前
linux kernel 比较数据大小的宏定义
linux·算法
程序开发阿元16 小时前
密码不进工具:一个独立开发者的服务器凭据管理办法
linux·ssh
AR-26710-19 小时前
Linux Day33——定时任务+lvm
linux·运维
墨痕诉清风20 小时前
SSRF漏洞实战记录+OSS桶命令执行+MCP漏洞
linux·服务器·数据库
byte轻骑兵20 小时前
实战 4:BlueZ 源码中添加自定义设备过滤规则
linux·物联网·bluez·电脑蓝牙·嵌入式蓝牙
瓦瓦gogo21 小时前
从一个 TypeScript 函数开始理解 MCP 协议
linux·ubuntu·typescript
鱼听禅1 天前
Ubuntu安装YOLOv8进行菌落识别训练
linux·python·yolo·ubuntu
测试界的小码农1 天前
【Linux 命令实战(04):文件内容查看,掌握 cat、less、head、tail】
linux·服务器·less
CodeYp20191 天前
第13讲:HTTPS 协议原理
linux·https