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 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)的更多相关文章
- ubuntu下安装低级版本gcc/g++ 并随意切换
来自:http://blog.sina.com.cn/s/blog_6cee149d010129bl.html 发现Android的版本中编译Host的程序经常因为本机的Gcc版本过高,需要这样那样的 ...
- 通过yum升级gcc/g++至版本4.8.2
最近在坐一个日期处理的问题,需要安装sxtwl模块,但是gcc版本4.7死活也安装不上,最后测试到只能升级gcc版本到4.8才得以解决 [root@123 bin]# gcc -vUsing buil ...
- 切换ubuntu-18.04启动方式
默认命令行形式启动 sudo systemctl set-default multi-user.target reboot 临时使用一次图形界面进入 sudo systemctl start ligh ...
- ubuntu 14.04 更新 gcc/g++ 4.9.2
ubuntu 14.04 更新 gcc/g++ 4.9.2 最近看到c++11非常的好用,尤其是自带了regex,于是稍微学了一下c++11的新特性.可是我在编译一个regex程序是却发现稍微复杂一点 ...
- 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 , ...
- c/c++ 多线程 ubuntu18.04 boost编译与运行的坑
多线程 boost编译与运行的坑 背景:因为要使用boost里的多线程库,所以遇到了下面的坑. 系统版本:ubuntu18.04 一,安装boost 1,去boost官网下载 boost_1_XX_0 ...
- Ubuntu18.04+CUDA9.0+cuDNN7.1.3+TensorFlow1.8 安装总结
Ubuntu18.04发行已经有一段时间了,正好最近Tensorflow也发布了1.8版本,于是决定两个一起装上,以下是安装总结,大致可 以分为5个步骤 确认当前软件和硬件环境.版本 更新显卡驱动,软 ...
- Ubuntu18.04安装RTX2080Ti+NVIDIA驱动+CUDA
Ubuntu18.04安装RTX 2080Ti 与 Cuda10 ==========血泪更新========= 如果可以使用ppa安装最方便了 具体参考:https://www.cnblogs.co ...
- Ubuntu18.04上安装NS-3
目录 第一步:处理gcc/g++版本 第二步:安装相关依赖 第三步:正式安装 第四步:测试 我自己前后安装过好几次NS3了,网上其他相关的博客质量都不是很好,因此自己总结了一个ns3的安装过程. 首先 ...
随机推荐
- Mac下配置/使用GitHub
一.配置1. 查看是否有id_rsa.pub文件:cd ~/.ssh 2. 如果没有id_rsa.pub文件,执行如下命令来生成id_rsa.pub文件: ssh-keygen -t rsa -C & ...
- maven聚合工程tomcat插件启动没有 Starting ProtocolHandler ["http-bio-8081"]
Starting ProtocolHandler ["http-bio-8081"]无法显示,一般有三个原因: (1)数据库连不上: (2)注册中心连不上(我这里用的是zookee ...
- Maven常见jar包依赖
<!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactI ...
- learning ddr init power-up initialization sequence
- lubuntu16.04 安装过程以及ssd测试模型的环境配置
1.系统启动盘(ultraISO)制作启动盘, 1/5 文件->打开,打开我们的iso镜像 2/5 选择我们的u盘, 3/5 点击启动->写入硬盘映像 4/5 写入方式选择raw,格式化然 ...
- UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- day35 数据库介绍和初识sql
今日内容: 1. 代码: 简易版socketsever 2.数据库(mysql)简单介绍和分类介绍 3.mysql root修改密码 4.修改字符集编码 5.初识sql语句 1.简易版socketse ...
- java的类class 和对象object
java 语言的源代码是以类为单位存放在文件中,已public修饰的类名须和存放这个类的源文件名一样.而 一个源文件中只能有一个public的类,类名的首字母通常为大写. 使用public修饰的类可以 ...
- C++基础知识:类的静态成员
1.普通成员变量通过对象名能够访问public成员变量每个对象都可以有只属于自己的成员变量成员变量不能在对象之间共享 2.从命名空间的角度:类的静态成员只是类这个命名空间中的全局变量和全局函数不同之处 ...
- httppost core net
public static string Post(string url, string data, Encoding encoding) { try { HttpWebRequest req = W ...