使用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 

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++- 

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++- 

可以发现,该命令形式为   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,它的状态就从自动变成了手动,这样安装脚本就不会更新它了。

gcc/g++多版本切换 (ubuntu18.04)的更多相关文章

  1. ubuntu下安装低级版本gcc/g++ 并随意切换

    来自:http://blog.sina.com.cn/s/blog_6cee149d010129bl.html 发现Android的版本中编译Host的程序经常因为本机的Gcc版本过高,需要这样那样的 ...

  2. 通过yum升级gcc/g++至版本4.8.2

    最近在坐一个日期处理的问题,需要安装sxtwl模块,但是gcc版本4.7死活也安装不上,最后测试到只能升级gcc版本到4.8才得以解决 [root@123 bin]# gcc -vUsing buil ...

  3. 切换ubuntu-18.04启动方式

    默认命令行形式启动 sudo systemctl set-default multi-user.target reboot 临时使用一次图形界面进入 sudo systemctl start ligh ...

  4. ubuntu 14.04 更新 gcc/g++ 4.9.2

    ubuntu 14.04 更新 gcc/g++ 4.9.2 最近看到c++11非常的好用,尤其是自带了regex,于是稍微学了一下c++11的新特性.可是我在编译一个regex程序是却发现稍微复杂一点 ...

  5. ubuntu 16.04 更新 gcc/g++ 4.9.2

    ubuntu 转载 2016年10月12日 :: 标签:ubuntu /g++ /gcc [html] view plain copy sudo dpkg -l g++ 最近在学C++primer , ...

  6. c/c++ 多线程 ubuntu18.04 boost编译与运行的坑

    多线程 boost编译与运行的坑 背景:因为要使用boost里的多线程库,所以遇到了下面的坑. 系统版本:ubuntu18.04 一,安装boost 1,去boost官网下载 boost_1_XX_0 ...

  7. Ubuntu18.04+CUDA9.0+cuDNN7.1.3+TensorFlow1.8 安装总结

    Ubuntu18.04发行已经有一段时间了,正好最近Tensorflow也发布了1.8版本,于是决定两个一起装上,以下是安装总结,大致可 以分为5个步骤 确认当前软件和硬件环境.版本 更新显卡驱动,软 ...

  8. Ubuntu18.04安装RTX2080Ti+NVIDIA驱动+CUDA

    Ubuntu18.04安装RTX 2080Ti 与 Cuda10 ==========血泪更新========= 如果可以使用ppa安装最方便了 具体参考:https://www.cnblogs.co ...

  9. Ubuntu18.04上安装NS-3

    目录 第一步:处理gcc/g++版本 第二步:安装相关依赖 第三步:正式安装 第四步:测试 我自己前后安装过好几次NS3了,网上其他相关的博客质量都不是很好,因此自己总结了一个ns3的安装过程. 首先 ...

随机推荐

  1. python中列表生成式

    1.简介 列表生成式即List Comprehensions,是Python中用于创建list的生成式. 2.示例 [表达式  循环体  条件语句] #!/usr/bin/env python # - ...

  2. ActiveMQ 的连接和会话

    要了解 connection 和 session 的概念,可以先从 ConnectionState 和 SessionState 入手: // 省略部分代码 public class Connecti ...

  3. view的focusable属性改变设置是否可获取光标

    注意图中我画的箭头,当时鼠标点击的黑色圈圈的位置,然后按钮出现了按下的效果(黄色的描边) 刚开始看到这种效果很是好奇,不知道是怎么实现的,后来仔细一想,应该是整个啤酒罐是一张图片(ImageView) ...

  4. 将数组,矩阵存入csv文件中

    我们在做各种模型训练时,往往会先将数据处理成矩阵,然后交给建模的人去训练.这时通常数据清洗者提交的是保存了矩阵的文件,一般为TXT或csv,接下来主要讲解我在实现这个过程中遇到的一些问题. impor ...

  5. os 模块 和 os模块下的path模块

    import os # os 主要用于与操作系统进行交互 #获取当前的工作目录 print(os.getcwd()) #切换工作目录 os .chdir("D:\上海python全栈4期\d ...

  6. centos6.5+python2.7+flask+apache+mod-wsgi部署

    flask部署,使用的是centos6.5,python2.7,版本很重要.基本步骤如下: 一.创建虚拟环境,创建目录把项目拷进去 二.安装mod-wsgi和apache easy_install m ...

  7. 技术宅学习Linux系统还是很有前途的

    老实说,我之所以入了Linux的坑,纯粹只是为了追我现在的男朋友,也就是技术宅.如果不是为了追我男朋友的话,我估计我这辈子都不会去接触linux.好吧,今天写一写过往事情,也是为了怀念当初追男友的一些 ...

  8. java⑿

    1.插入: 插入算法: 前提是数组中的数据必须是有序的 public static void main(String[] args) { // 先定义一个int类型的数组 int[] nums = n ...

  9. mq(1):简介

    1.mq的使用场景 以前的我,一直都没太搞明白,为什么我们那么需要消息队列,直到我看到了网友scienjus.的这个例子. 例子:假设用户在你的软件中注册,服务端收到用户的注册请求后,它会做这些操作: ...

  10. day037 行记录的操作

    1.库操作 2.表操作 3.行操作 1.库操作 1)创建数据库 语法: create database 数据库名 charset utf8; 数据库命名规则: 由数字,字母,下划线,@,#,$ 等组成 ...