Linux纯命令行以源码编译安装gcc13
文章目录
一、介绍
欢迎阅读这篇关于在Linux系统中从源码编译安装GCC 13的详细指南。GCC(GNU Compiler Collection)作为一个强大的编译器集合,对于开发者来说是至关重要的工具之一。在这篇文章中,我们将探讨如何通过纯命令行的方式,从源代码构建并安装最新版本的GCC 13。为什么选择源码编译?源码编译不仅能够让我们获得最新的GCC版本,还允许我们在系统中灵活地配置和使用编译器。通过深入了解每个步骤,读者将能够更好地理解GCC的安装过程,并根据自己的需求进行定制。
这篇指南将分为几个主要部分,首先从准备工作开始,包括更新系统和安装必要的依赖项。接下来,我们将下载GCC 13的源码,并通过一系列命令行操作完成配置、编译和安装。最后,我们将解释如何更新系统中的软连接,确保系统默认使用新版本的GCC。
通过遵循本文的步骤,读者将能够成功地在Linux系统中安装GCC 13,同时深入了解编译器的构建过程。
二、步骤
0. 准备工作
- 首先源码编译gcc,得先有gcc(滑稽.jpg)。是的你没听错,关于这个先有鸡还是先有蛋的问题,我们先下载一下gcc。在命令行输入
sudo apt update && sudo apt upgrade
更新一下,然后按系统选择安装开发包sudo apt install build-essential #Ubuntu开发工具包sudo yum groupinstall "Development Tools" #Centos开发工具包
安装完毕后gcc等开发工具就自动装好了。此时安装的gcc为较低版本的gcc。 - 检查硬件。因为编译gcc是一项非常耗费时间的事情,取决你cpu核心数和内存情况以及存储空间是否足够。使用
lscpu
查看cpu情况使用free -h
查看内存情况使用df -h
查看存储空间,名字可能有所不同,只需关注挂载点是否是/目录即可一般只关注根目录剩余的空间即可,如果可用空间在20g以上即可跳过直到[步骤1. 下载](### 1. 下载),如果觉得空间不足或者cpu核心太少内存太少可以选择扩容存储空间和内存和添加更多cpu核心。WSL:先将wsl关机,cmd输入wsl --shutdown
然后在wsl配置文件 “C:\Users[yourname].wslconfig” 使用记事本打开,按照下面的自行编辑。如果没有这个文件可自行在此目录下新建一个.wslconfig文件# 在 WSL 2 上应用于所有运行的 Linux 发行版的设置[wsl2]# 限制虚拟机内存使用不超过 2 GB,可以使用 GB 或 MB 来设置为整数memory=2GB# 设置虚拟机使用两个虚拟处理器processors=2# 将交换存储空间的量设置为 2 GB,默认为可用 RAM 的 25%swap=2GB# 打开默认连接,将 WSL 2 的 localhost 绑定到 Windows 的 localhost#localhostforwarding=true# 禁用嵌套虚拟化nestedVirtualization=false# 强制 WSL 使用 Windows 的 HTTP 代理信息#autoProxy=true
VMware或其他虚拟机软件:将虚拟机关机后选择虚拟机进入编辑虚拟机设置自行调整。再次进入虚拟机后查看存储空间发现还是未扩容,这是因为没将新的存储加入到虚拟机逻辑卷中。检查硬盘扩展情况:在你的虚拟机中执行命令sudo fdisk -l
,确保新的硬盘空间已经被识别。你应该能够看到扩展后的硬盘设备,例如 /dev/sda。更新物理卷(Physical Volume):使用sudo pvresize /dev/sda
命令更新物理卷的大小,将新增的空间纳入物理卷。扩展逻辑卷:使用sudo lvextend -l +100%FREE /dev/[挂载点是根目录的文件系统名,如sdb]
扩展逻辑卷。假设你要添加刚刚你新增的所有的空间,这里使用了 -l +100%FREE 表示使用所有可用的空间。扩展文件系统:最后一步是将文件系统扩展到新的空间。如果你的逻辑卷上运行的是 ext4 文件系统,可以使用 resize2fs 命令:sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
如果是 xfs 文件系统,可以使用 xfs_growfs 命令:sudo xfs_growfs /dev/ubuntu-vg/ubuntu-lv
现在,你的逻辑卷应该已经成功扩展,并且新的硬盘空间已经被纳入使用。
至此准备工作结束
1. 下载
既然是以源码安装gcc,自然第一步先把源码包下载到手。官方网站下载慢并且现在好像不提供下载服务,所以我们自己在网上找到一个镜像网站的下载链接复制或直接用我用的这个南京大学的镜像然后去到命令行敲下
wget -P ~ 'https://mirrors.nju.edu.cn/gnu/gcc/gcc-13.1.0/gcc-13.1.0.tar.gz'
开始下载
等待下载完毕后使用
ls -lh
查看用户主目录应该有一个下载好的tar.gz包
2. 编译安装
解压源码包
tar -zxvf gcc-13.1.0.tar.gz
等待解压完成得到目录gcc-13.1.0。cd进入gcc-13.1.0目录后mkdir一个build目录方便观察。此时在gcc-13.1.0/build目录下运行命令
../configure
开始配置安装。开始配置后可能会出现缺少缺少 GMP、MPFR和 MPC这三个高精度的数学库的问题如
configure: error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.
也可能出现检测到系统缺少 32 位开发库(libc 和头文件)。GCC 默认情况下会尝试构建支持多架构(multilib)的编译器,即同时支持 32 位和 64 位目标。所以缺少 32 位开发库,也会导致构建过程失败。
configure: error: I suspect your system does not have 32-bit development libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.
自行选择对应的系统安装五个库解决
sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev # Ubuntu三个高精度数学库
sudo yum install gmp-devel mpfr-devel libmpc-devel # Centos三个高精度数学库
sudo apt-get install gcc-multilib g++-multilib # Ubuntu32位开发库
sudo yum install glibc-devel.i686 libgcc.i686 # Centos32位开发库
再次使用
../configure --enable-multilib
构建安装环境,构建完成后得到一个Makefile文件,输入
make -j 8
开始编译构建(-j选项后的数字取决于你的cpu核心数)。
稍逝等待……(取决你的电脑性能,本人编译了一下午,期间还被空间不足内存不足打断)漫长地等待过后,终于编译构建完成!发现build目录多了一堆东西
此时再输入
sudo make install
安装gcc,又是漫长地等待……
等待到它自动运行结束后终于安装完毕!但此时你输入
gcc --version
会发现gcc还是旧版本
这是因为我们还没修改软连接,此时的gcc命令还是链接着旧版本的gcc。让我们来修改一下软连接。
3. 修改软连接
输入
which gcc
可以找到当前使用的gcc的目录
cd /usr/bin
进入该目录后输入
ls -lh gc* g+*
观察到gcc和g++都是通过软连接到gcc-9和g+±9(数字可能不同,数字代表gcc的版本),我们将软连接删除重新软连接到新版本。
输入
sudo rm gcc g++
删除链接,然后输入
sudo ln -s /usr/local/bin/gcc /usr/bin/gcc && sudo ln -s /usr/local/bin/g++ /usr/bin/g++
新建两个软连接。其中/usr/local/bin目录是我们安装新版gcc/g++所处的安装目录。再次查看软连接、gcc/g++版本
大功告成!
三、总结
这篇文章详细介绍了在Linux系统中从源码编译安装GCC 13的步骤。通过准备工作、源码下载、编译安装以及软连接的修改,我们成功地完成了这一过程。通过源码编译,不仅获得了最新版本的GCC,还能更灵活地配置和使用编译器。阅读者可以根据本文提供的指南,轻松地在Linux环境中安装GCC 13,并对编译器的构建过程有更深入的了解。愿这篇文章为您的学习和实践提供有益的指导。如果您有任何疑问或需要进一步的帮助,请随时留言。
原文链接:Linux纯命令行以源码编译安装gcc
版权归原作者 鱼圆食不食 所有, 如有侵权,请联系我们删除。