zoukankan      html  css  js  c++  java
  • gcc/g++多版本切换 (ubuntu18.04)

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

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

    sudo apt-get install gcc-4.8
    sudo 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 50
    
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
    
    sudo 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 50
    
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50
    
    sudo 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   gcc

    update-alternatives --display    服务名

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

    交互式修改

    交互式修改会提供该服务名下所有可用的版本, 选择对应的索引确认。

    sudo update-alternatives --config  gcc

    sudo update-alternatives --config   服务名

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

    手动将服务改为自动模式:

    sudo update-alternatives --auto gcc

    添加候选项:

    sudo update-alternatives --set    gcc    /usr/bin/gcc-4.8

    update-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

    服务中  某可执行文件路径的优先级数字越大,优先级越高:

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

    注:

    下面内容来自:

    http://www.linuxeye.com/Linux/alternatives.html

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

  • 相关阅读:
    dirname,basename的用法与用途
    终极解决方案——sbt配置阿里镜像源,解决sbt下载慢,dump project structure from sbt耗时问题
    linux-manjaro下添加Yahei Hybrid Consola字体
    Idea无法调出搜狗等中文输入法
    Spring 源码学习系列
    BF算法
    Mybatis Mapper接口是如何找到实现类的-源码分析
    Lua脚本在redis分布式锁场景的运用
    GO语言一行代码实现反向代理
    SpringMVC源码分析-400异常处理流程及解决方法
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/10351763.html
Copyright © 2011-2022 走看看