最近在编译clickhouse的过程中,遇到了操作系统默认安装了一个clang 10的版本,但编译clickhouse需要安装11版本以上的clang程序,所以就通过命令:
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
安装了一个最新版本 13的clang程序,具体如下:
可以看到有2个版本的clang;
现在我们要通过update-alternatives 工具,来指定一个系统默认调用的程序版本;
1.首先,我们查看一下系统是否已经有这个clang的配置:执行命令:
update-alternatives --display clang
可以看到系统当前没有默认执行clang程序的配置;
2.创建一个clang的默认程序配置信息;
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-13 100
其中,最后一个参数100,是一个自己指定的优先级(或者叫版本号)的值,这个值越大,说明它的优先级越高,系统在auto模式下从这个值最大的里面选择默认程序;
如下:
第一次设置失败是因为权限的问题,切换到root账号下,就执行成功了;
3.验证是否配置成功
执行命令:update-alternatives --display clang ,结果如下说明创建成功
4.这个时候,我们只是创建了一个clang的默认程序配置,clang++还没有对应的改过来,查看clang++的版本号执行命令:clang++ -v
我们可以看到,还是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
执行完命令后,查看版本号结果如下:
我们可以看到,配置成功了;默认的clang++也成了13的版本了;
6.我就想能在2个版本之间随意的切换,怎么办呢?
可以的,我们先找到路径 /usr/bin 路径下,执行ll查看当前路径下的程序,如下图:
我们可以看到,在当前路径下,有一个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
结果如下:
看着似乎没有生效,但大家注意,我命令行中的优先级给的是90这个值,是小于13版本给的100的,但他到底创建成功了没?我们通过下个命令 --config来查看,具体命令如下:
sudo update-alternatives --config clang
从结果中,能看到clang-10的配置项已经创建成功了,只不过在auto mode下,系统默认选择的是13的版本,同时当前命令行下,我们可以手动选择默认版本,这里我们输入1,即clang-10对应的编号:
验证一下我们的选择对不,执行命令clang -v查看版本号如下:
我们可以看到,clang的默认版本号已经改成了10版本;再次执行命令:
sudo update-alternatives --config clang
我们选择0,自动模式,结果如下:
我们看到,程序clang的版本号,又切换到了clang-13的版本;
总结:在系统安装了多个程序版本的情况下,可以通过sudo update-alternatives --config 来选择默认的版本号;当然其前提是创建了对应版本的软连接;