Ubuntu系统中多个版本的程序指定默认版本

最近在编译clickhouse的过程中,遇到了操作系统默认安装了一个clang 10的版本,但编译clickhouse需要安装11版本以上的clang程序,所以就通过命令:

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" 

安装了一个最新版本 13的clang程序,具体如下:

Ubuntu系统中多个版本的程序指定默认版本

可以看到有2个版本的clang;

现在我们要通过update-alternatives 工具,来指定一个系统默认调用的程序版本;

1.首先,我们查看一下系统是否已经有这个clang的配置:执行命令:

update-alternatives --display clang

Ubuntu系统中多个版本的程序指定默认版本

可以看到系统当前没有默认执行clang程序的配置;

2.创建一个clang的默认程序配置信息;

update-alternatives  --install /usr/bin/clang clang /usr/bin/clang-13 100 

 其中,最后一个参数100,是一个自己指定的优先级(或者叫版本号)的值,这个值越大,说明它的优先级越高,系统在auto模式下从这个值最大的里面选择默认程序;

如下:

Ubuntu系统中多个版本的程序指定默认版本

第一次设置失败是因为权限的问题,切换到root账号下,就执行成功了;

3.验证是否配置成功

执行命令:update-alternatives --display clang   ,结果如下说明创建成功

Ubuntu系统中多个版本的程序指定默认版本

4.这个时候,我们只是创建了一个clang的默认程序配置,clang++还没有对应的改过来,查看clang++的版本号执行命令:clang++ -v

Ubuntu系统中多个版本的程序指定默认版本

我们可以看到,还是10的版本;

5.配置clang++的默认执行程序

执行命令:sudo update-alternatives  --install /usr/bin/clang clang /usr/bin/clang-13 100 --slave  /usr/bin/clang++ clang++ /usr/bin/clang++-13

执行完命令后,查看版本号结果如下:

Ubuntu系统中多个版本的程序指定默认版本

我们可以看到,配置成功了;默认的clang++也成了13的版本了;

6.我就想能在2个版本之间随意的切换,怎么办呢?

可以的,我们先找到路径 /usr/bin 路径下,执行ll查看当前路径下的程序,如下图:

Ubuntu系统中多个版本的程序指定默认版本

我们可以看到,在当前路径下,有一个clang-10、clang-13 以及clang对应的软连接,clang++也类似;

于是我们可以执行如下命令;给clang-10的版本也创建一个配置选项在默认程序的配置文件里;

sudo update-alternatives  --install /usr/bin/clang clang /usr/bin/clang-10 90 --slave  /usr/bin/clang++ clang++ /usr/bin/clang++-10

结果如下:

Ubuntu系统中多个版本的程序指定默认版本

看着似乎没有生效,但大家注意,我命令行中的优先级给的是90这个值,是小于13版本给的100的,但他到底创建成功了没?我们通过下个命令 --config来查看,具体命令如下:

sudo update-alternatives --config clang

Ubuntu系统中多个版本的程序指定默认版本

从结果中,能看到clang-10的配置项已经创建成功了,只不过在auto mode下,系统默认选择的是13的版本,同时当前命令行下,我们可以手动选择默认版本,这里我们输入1,即clang-10对应的编号:

验证一下我们的选择对不,执行命令clang -v查看版本号如下:

Ubuntu系统中多个版本的程序指定默认版本

我们可以看到,clang的默认版本号已经改成了10版本;再次执行命令:

sudo update-alternatives --config clang

我们选择0,自动模式,结果如下:

Ubuntu系统中多个版本的程序指定默认版本

我们看到,程序clang的版本号,又切换到了clang-13的版本;

总结:在系统安装了多个程序版本的情况下,可以通过sudo update-alternatives --config 来选择默认的版本号;当然其前提是创建了对应版本的软连接;

上一篇:Guava Lists 类


下一篇:clang-format 对 c++ 进行格式化