【linux】gcc/g++傻傻分不清?如何实现ubuntu多版本gcc/g++切换

如何实现同一台服务器不同版本gcc/g++的随意切换呢

一、分清gcc/g++

  1. gcc/g++是啥

GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)

  1. gcc/g++有啥区别?
  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译
  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  4. gcc在编译C文件时,可使用的预定义宏是比较少的
  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:
    #define GXX_WEAK 1
    #define __cplusplus 1
    #define __DEPRECATED 1
    #define GNUG 4
    #define __EXCEPTIONS 1
    #define private_extern extern
  6. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个

二、gcc/g++版本查看和安装

  1. 查看当前gcc/g++版本
gcc -v
g++ -v

在这里插入图片描述
可以看到我这里的版本是gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~16.04)

  1. 查看系统已安装gcc/g++版本
ll /usr/bin/gcc*
ll /usr/bin/g++*

在这里插入图片描述

  1. 若没有需要的版本,先安装

例如:

sudo apt install gcc-5
sudo apt install g++-5

#安装gcc-7和g++-7
sudo apt install gcc-7
sudo apt install g++-7

如果安装失败,参考这篇文章解决:【ubuntu】apt-get install失败的解决方法和参数解析

三、使用update-alternatives管理版本切换

1. 首先查看当前的gcc/g++是否是通过update-alternatives管理的

查看其链接方式

ll /usr/bin/gcc*
ll /usr/bin/g++*

下图所示,则表明是用update-alternatives管理的
在这里插入图片描述
下图所示,则表明不是用update-alternatives管理的,是直接链接到了对应版本的可执行文件
在这里插入图片描述

2. 先将需要的版本添加到update-alternatives 中

方式1:gcc/g++分别添加

# gcc
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 70

# g++
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 70
# 数字50,70代表优先级,数字越大优先级越高

如果报错:update-alternatives: error: alternative g++ can’t be master alternative: it is a slave of gcc.
那么得采用方式2

方式2,gcc/g++一起加

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7

如果报错:update-alternatives: error: alternative g++ can’t be slave of gcc: it is a master alternative.
那么得采用方式1。

### 3. 手动配置update-alternatives选择gcc/g++版本

```bash
sudo update-alternatives --config gcc
sudo update-alternatives --config g++

出现下图所示提示,输入对应数字就可以切换了,当前是gcc-7,想切换成gcc-6,则输入1再回车。
在这里插入图片描述
再输入gcc -v查看版本。

可以看到修改成功,由7换成了6,gcc version 6.5.0 20181026 (Ubuntu 6.5.0-2ubuntu1~16.04)
在这里插入图片描述

3. 从update-alternatives 中移除

sudo update-alternatives --remove gcc /usr/bin/gcc-5

四、直接通过软链接来版本切换

1. 我们查看gcc的链接方式

ll /usr/bin/gcc*

可以看到蓝色的表示连接文件,绿色的表示可执行文件
其实调用不同版本的gcc/g++,最终调用的就是相应版本的绿色的那个可执行文件
例如:
gcc-6调用的可执行文件就是x86_64-linux-gnu-gcc-6
gcc-7调用的可执行文件就是x86_64-linux-gnu-gcc-7
在这里插入图片描述
因此,想要修改系统默认的gcc/g++版本,只需将对应版本的可执行文件直接通过软链接连给/usr/bin/gcc文件就可以。

2. 软链接切换版本

2.1 删除原有软链接

方式一:

sudo unlink /usr/bin/gcc

方式二:注意不要多打’/',否则会删除实际数据

sudo rm -rf /usr/bin/gcc

2.2 建立新的软链接

sudo ln -s /usr/bin/x86_64-linux-gnu-gcc-7 /usr/bin/gcc

查看结果,发现链接成功
在这里插入图片描述
再输入gcc -v,可以看到修改成功。
在这里插入图片描述

五、总结

其实发现三和四本质上都是通过改变软连接的方式来实现版本切换,三是先把不同的软链接通过update-alternatives来统一管理,方便切换。而四是直接通过修改软链接来切换,更加直接。

举一反三

其实通过update-alternatives可以实现很多程序的版本切换,比如cuda

  • 先添加到update-alternatives
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-10.0 10
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-10.2 20

再切换版本

sudo update-alternatives --config cuda

在这里插入图片描述
输入数字切换版本,可以发现能够自由切换成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43693967/article/details/123719406#comments_28551687