记一次编译GCC的经历

news/2024/10/7 6:47:07

背景

因为有在Linux环境编译C++程序的需求,故我于近日在电脑上安装了WSL。鉴于APT(Ubuntu的包管理器)提供的GCC版本较老(确切来说,APT会根据Ubuntu版本来下载并安装某个版本的GCC,不一定为最新,例如对Ubuntu 22.04而言,从APT获取的最新版本GCC为11.2.0),我便尝试自己编译一套GCC工具链。
在编译之前,我发现GNU提供的GCC安装教程内容组织较为混乱,新手容易踩坑(羊头你这是生怕新手能顺利编译好GCC啊,你不会写教程就别写😠)。于是,在查阅了其他人编写的GCC编译教程后,我结合了我自己的(踩坑)经验,编写了这篇文章。

准备

  • Linux环境(我用的是WSL Ubuntu 22.04,因为这是WSL目前所提供的最新版本的Ubuntu)
  • 畅通无阻的网络环境
  • 先前的GCC编译器
  • 一些其他的软件包

步骤

打开终端,先将本机上现有的软件包更新至最新:

sudo apt update && sudo apt upgrade

若遇到网络问题,则需要更改镜像源。本人推荐中科大镜像源和清华镜像源。具体修改方法参见镜像源提供的帮助信息,此处不再赘述。

更新完成后,根据此页面,我们需要安装编译GCC所需的软件包:

sudo apt install build-essential python3 gnat gdc gm2 gawk binutils gzip bzip2 make tar perl libgmp-dev libmpfr-dev libmpc-dev libisl-dev zstd gettext autoconf m4 automake gperf dejagnu expect tcl autogen guile-3.0 flex texinfo texlive sphinx-common git ssh diffutils patch libtool

随后,我们将GCC源代码clone至本地:

git clone git://gcc.gnu.org/git/gcc.git

读者可以自己修改存放源代码的文件夹名称,只需在链接后面加上文件夹名称即可,例如gcc_src。这里我就用默认的gcc文件夹来指代GCC源代码目录了,以下同理。

若遇到网络问题,则同样可以从镜像源clone。只需把链接换成https://mirrors.tuna.tsinghua.edu.cn/git/gcc.git即可(此处以清华镜像源举例)。

在进入GCC源代码目录之前,我们可以先创建一个名为gcc_build的文件夹(即存放GCC临时编译文件及GCC本体的文件夹),与GCC源代码目录同级:

mkdir gcc_build

此时执行ls,终端输出如下:

gcc gcc_build

随后通过cd gcc进入GCC源代码目录。

在配置GCC编译配置前,我们需要切换tag至某个release版本,否则编译产物将为当前最新的GCC开发版。当前最新的发行版GCC的版本号为14.1.0,因此我们执行此命令:

git checkout releases/gcc-14.1.0

这样就可以了。

  • 可能读者知道GCC源代码里已经包含了自动安装依赖的脚本,即./contrib/download_prerequisites。我们还需要执行它吗?答案是不需要。我大致分析了脚本内容,发现这个脚本下载并安装的是这五个软件包:gmpmpfrmpcislgettext,相关源代码可见此。而这些软件包,我们已经在前面安装过了,所以我们无需再安装一遍它们。

接下来,我们进入到我们刚刚创建的新文件夹:

cd ..
cd gcc_build

根据此页面,我们需要先配置好GCC编译配置。这里给出我的编译配置,读者可以按需修改:

../gcc/configure --prefix=/usr/local/gcc-14.1.0 --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --enable-languages=c,c++,go,jit,lto,rust --enable-host-shared --enable-shared --enable-static --enable-libatomic --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-lto --enable-libgomp --enable-linker-build-id --enable-threads=posix --enable-nls --enable-bootstrap --enable-locale=gnu --enable-cxx-locale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time --enable-gnu-unique-object --enable-plugin --enable-default-pie --enable-cet --enable-checking=release --enable-link-serialization=2 --disable-multilib --with-build-config=bootstrap-lto --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++ --with-libiconv --with-default-libstdcxx-abi=new --with-system-zlib --with-target-system-zlib=auto --with-tune=generic --without-included-gettext --without-cuda-driver
  • 由于本人也有Rust相关需求,故--enable-languages一项添加了rust。添加rust时,读者应确保本机已安装Rust。若不安装Rust就执行此命令,则此命令会报错,提示“找不到Cargo”。安装Rust的步骤见此。

接下来就可以愉快的make了!(然后编译失败时就愉快不起来了XD)

编译完成后,执行sudo make install,编译好的GCC便会安装至/usr/local/gcc-14.1.0

接下来,我们可以选择替换掉系统原来的GCC:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-14.1.0/bin/gcc 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/local/gcc-14.1.0/bin/g++ 60

替换掉原来的GCC的好处是,你可以直接运行gcc命令而无需添加目录前缀,使用起来会更方便。

我们再执行命令gcc -v,就会得到如截图所示的输出:

image

这就表示我们的替换已经生效了!

总结

编译GCC会锻炼耐力,原因有二:

  1. GCC配置非常多,这便是在锻炼耐力与英语阅读理解能力(当然逃课办法是用CharGPT,不过它可能会给你错误答案)。

  2. GCC编译过程非常慢,短则半小时,长则好几个小时,期间还有可能发生意外(我遇到的意外有“找不到xxx.cc”,以及因内存不足,从而编译器进程被系统杀死等)导致编译失败,这便也是在锻炼耐力,即:有条不紊、镇定自若地处理错误,然后从头开始编译/配置(痛苦面具.jpg)之耐力。

不说了,好累!我要去休息一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/42851.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

sql左连接查询时,右表的条件应该写在WHERE后面还是ON后面

在SQL的左连接查询(LEFT JOIN)中,右表的条件应尽量写在ON子句后面。这是因为:ON子句:用于定义两个表之间的连接条件,决定了哪些行会从右表中选择出来与左表进行匹配。 WHERE子句:用于过滤整个结果集,在连接操作完成之后应用。如果将针对右表的过滤条件放在WHERE子句而不…

使用 .NET 集成 MinIO 实现高效对象存储

引言https://min.io/在现代软件开发中,存储和管理大量的非结构化数据(如图片、视频和文档)变得越来越重要。对象存储解决方案如 Amazon S3 已成为主流,但其高昂的成本和对公有云的依赖使得很多开发者寻求开源和自托管的替代方案。MinIO 作为一款高性能的开源对象存储系统,…

R3CTF -Cry(部分)

上线看了一下题,就做了三个,还是太菜了(T~T) r0system 题目出的很抽象,就是代码长,没有啥别的考点,先创建一个账号,登录进入后修改Alice账号密码,再使用Alice登录拿到私钥就好了。 from hashlib import md5 from Crypto.Cipher import AES from Crypto.Util.number im…

后端接口性能优化分析

原文链接:https://blog.csdn.net/qq_40851232/article/details/134401234定位问题 1.慢查询日志 通常情况下,为了定位sql的性能瓶颈,我们需要开启mysql的慢查询日志。把超过指定时间的sql语句,单独记录下来,方面以后分析和定位问题。 开启慢查询日志需要重点关注三个参数:…

「笔记」递归算法复杂度分析

可恶的算法分析与设计!!!目录写在前面递归算法形式递归树大力求和主定理 Master Theorem典题1234写在最后 写在前面 可恶的算法分析与设计!!! 递归算法形式 对于一个输入规模为 \(n\) 的递归算法,每次均为将整个问题划分为 \(a\) 个规模为 \(\frac{n}{b}\) 的子问题,回…

NOIP2024模拟12:孤帆远影

这两次模拟赛都不是很专注!T1两次都G掉了!迅速调整状态,专注于自己的思考,打好草稿!NOIP2024模拟12:孤帆远影听了机房同学的讨论,于是T1死磕冒泡和逆序对做法。最后只得了40pts。 思想对了,但不是自己的做法。 还是要坚持自己想,坚持自己可以想出来,不要被任何人带偏。T1一…

mORMot and Open Source friends SynProject Tutorial (SynProject教程)

mORMot and Open Source friends SynProject Tutorial--(SynProject 教程) 第一步 本页介绍SynProject的一些典型用法。 我们将为mORMot框架本身创建一个源代码存储库和相关的文档。 您要求文档,我们将通过SynProject自动生成它! 我们需要什么 因此,我们在硬盘上的D:\Dev\Li…

计算机简史第四章 电子时代之图灵机

讲讲图灵对计算机的贡献讲讲图灵对计算机的贡献 ‍ 图灵机发明的背景 阿兰马蒂森图灵 (Alan Mathison Turing)于 1921 年出生在伦敦, 从小就表现出惊人数学和科学能力。 ​​ 艾伦麦席森图灵(Alan Mathison Turing),1912-1954,英国数学家、计算机学家、逻辑学家、密码学…