您的当前位置:首页正文

gccg++多版本切换(ubuntu18.04)

2024-06-03 来源:易榕旅网
gccg++多版本切换(ubuntu18.04)

使⽤Ubuntu18.04已经有⼀段时间了,在使⽤过程中经常需要处理不同软件的编译⼯作,但是这时候就遇到这样⼀个问题,那就是不同软件,甚⾄是同⼀个软件的不同版本都会使⽤不同版本的gcc/g++来进⾏编译。

Ubuntu18.04中⾃带的gcc/g++ 版本为7.3, 这时候如果我们想要安装4.8版本的,那么命令如下:

sudo apt-get install gcc-4.8sudo apt-get install g++-4.8

安装成功后查看gcc/g++调⽤版本是否正确:

由上图可以发现即使是安装好gcc/g++ 4.8版本后我们的系统识别的版本还是7.3 。

查看gcc/g++ 具体地址:

查看路径下是否存在多版本的gcc/g++ :

ls /usr/bin/gcc*ls /usr/bin/g++*

我们可以发现其实系统⾥⾯已经有三个版本的gcc/g++, 分别是4.8, 5, 7 。

查看细节:

可以发现,gcc⽅⾯:

/usr/bin/gcc 是链接到 /etc/alternatives/gcc上的,⽽

/usr/bin/gcc-7 是链接到 /usr/bin ⽬录下的 x86_64-linux-gnu-gcc-7 ,/usr/bin/gcc-4.8 和 /usr/bin/gcc-5 是没有链接到任何⽂件的。

g++⽅⾯:

/usr/bin/g++ 链接到 /etc/alternatives/g++ 上的,

/usr/bin/g++-7 链接到 /usr/bin/ ⽬录下 x86_64-linux-gnu-g++-7 ⽂件的,

/usr/bin/g++-4.8 和 /usr/bin/g++-5 是没有链接到任何⽂件的。

接着下⼀步,我们查看 /usr/alternatives/gcc 和 /usr/alternatives/g++ 的详细情况:

可以发现 /usr/alternatives/gcc 和 /usr/alternatives/g++ 最终链接⼜回到了 /usr/bin/ ⽂件⽬录下的 gcc-7 和 g++-7 。

由此我们可以⼤胆猜测, 可执⾏⽂件 /usr/bin/gcc 和 /usr/bin/g++ 其实就是⼀个软链接,真正的可执⾏⽂件其实是:/usr/bin/gcc-4.8 所指向的 /usr/bin/x86_64-linux-gnu-gcc-4.8jiu 就是可执⾏⽂件,/usr/bin/gcc-5 所指向的 /usr/bin/x86_64-linux-gnu-gcc-5 就是可执⾏⽂件,/usr/bin/gcc-7 所指向的 /usr/bin/x86_64-linux-gnu-gcc-7和

/usr/bin/g++-4.8 所指向的 /usr/bin/x86_64-linux-gnu-g++-4.8 就是可执⾏⽂件,/usr/bin/g++-5 所指向的 /usr/bin/x86_64-linux-gnu-g++-5 就是可执⾏⽂件,/usr/bin/g++-7 所指向的 /usr/bin/x86_64-linux-gnu-g++-7

作为中转的软链接,/usr/alternatives/gcc 和 /usr/alternatives/g++ 是我们在做gcc/g++版本选择时所需要切换的⽂件,同时指定版本的/usr/bin/gcc-* 和 /usr/bin/g++-* 会指向同⽬录下的可指向⽂件。⽽,

/usr/bin/gcc -> /etc/alternatives/gcc

/usr/bin/g++ -> /etc/alternatives/g++ 是固定不变的。

=============================================================

前⾯内容为⼀些探索过程,下⾯给出具体步骤:

由下图可知系统⾥⾯⼀共安装了三个版本的gcc/g++, 分别为4.8, 5, 7 。

update-alternatives

是ubuntu系统中专门维护系统命令链接符的⼯具,通过它可以很⽅便的设置系统默认使⽤哪个命令、哪个软件版本。

执⾏命令:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 50

可以发现,该命令形式为 update-alternatives --install + (多版本命令在系统中的进⼊地址) + (在update-alternatives中的注册名称)+ (实际可执⾏命令的物理地址) + (⾃动模式下的优先级数字)

多版本命令在系统中的进⼊地址:

在gcc 中,该部分为 /usr/bin/gcc 在g++中该部分为 /usr/bin/g++ ,

该部分就是我们在系统中执⾏gcc/g++命令时在搜索路径中的搜索到命令的地址。我们在系统终端执⾏gcc/g++时调⽤的就是 /usr/bin/gcc 和 /usr/bin/g++ 。

在update-alternatives中的注册名称:

我们在 update-alternatives 软件中注册的服务名, 我们在update-alternatives 中管理的服务名就是这个注册的服务名。这⾥分别是 gcc 和 g++ 。以后管理时以它为关联依据。

实际可执⾏命令的物理地址:

这⾥是各个版本的gcc/g++中磁盘中的实际物理地址,即各个版本的可执⾏⽂件的地址。这⾥是; /usr/bin/gcc-4.8 , /usr/bin/gcc-5 , /usr/bin/gcc-7/usr/bin/g++-4.8 , /usr/bin/g++-5 , /usr/bin/g++-7 。

⾃动模式下的优先级数字:

指的是 设置的服务名 的服务在⾃动模式下的优先级。优先级,数字越⼤优先级越⾼。

========================================查看已注册列表

update-alternatives --display gccupdate-alternatives --display 服务名

由上图,可以发现模式为 ⾃动模式。

交互式修改

交互式修改会提供该服务名下所有可⽤的版本, 选择对应的索引确认。sudo update-alternatives --config gccsudo update-alternatives --config 服务名

可以发现交互式修改后 该服务模式变为⼿动模式。

⼿动将服务改为⾃动模式:sudo update-alternatives --auto gcc

添加候选项:

sudo update-alternatives --set gcc /usr/bin/gcc-4.8update-alternatives --set +服务名+ 可执⾏命令的物理路径

--set 命令可以⾮交互式的改变 服务 gcc 的执⾏,⽽不⽤使⽤ --config 进⾏交互式的⼿动改变服务的指向。

可以看到该命令 ⾮交互式的改变了 gcc 服务的 指向, 执⾏该命令之前gcc指向gcc-7, 执⾏之后指向gcc-4.8 。

查看注册到某服务名下的各个可执⾏⽂件路径:sudo update-alternatives --list gcc

可以看到 服务 gcc 之下⼀个有三个可执⾏⽂件注册。

删除某服务:

update-alternatives --remove-all gcc

删除某服务中的某候选项:

update-alternatives --remove gcc /usr/bin/gcc-4.8

服务中 某可执⾏⽂件路径的优先级数字越⼤,优先级越⾼:

================================================================== 注:

下⾯内容来⾃:

update-alternatives在⼀般情况下是由postinst和prerm这样的安装脚本⾃ 动调⽤的,所以⼀个alternative的状态有两种:⾃动和⼿动。每个alternative的初始状态都是⾃动,如果系统发现管理员⼿动修改了⼀个 alternative,它的状态就从⾃动变成了⼿动,这样安装脚本就不会更新它了。

因篇幅问题不能全部显示,请点此查看更多更全内容