Debian很稳定,但是必须要添加unstable源才能安装一些需要更新的软件,比如说稳定版的firefox是ESR版的,必须要从unstable源才能安装新版。但是unstable源是把所有的软件包都放在里面,操作过程中一旦不小心把核心组件更新到unstable版,那就会带来严重的问题。
Arch系很新,也就意味着稳定性差一些。
openSUSE Leap更加稳定,但是自带的软件包版本过低。不过有OBS(openSUSE build service)支持的第三方源,可以通过第三方源安装更新的版本。比如说Leap 15.6自带的firefox是ESR版的,但是可以通过第三方源安装最新版的从而让机器上有最新版本的firefox用,而第三方源的内容通常受到严格的限制,比如说firefox源就只有firefox相关内容,不会在更新的时候影响到系统的核心组件。这样就可以在稳定的系统上运行较新的软件。
因为最近需要使用高版本的gcc,所以使用了第三方源把Leap 15.6上的gcc-7.5更新到了gcc-13.3。实际上openSUSE的处理方法不是把旧的gcc删除,然后替换为新版的;而是在系统里安装了两个gcc,分别是7.5和13.3版。通过
bash
gcc-7
可以使用7.5版本的gcc
通过
bash
gcc-13
可以使用13.3版本的gcc
在使用zypper安装gcc的时候,系统会自动安装cpp、gcc、gcc-c++、gcc-fortran、gcc-info这么几个包
这几个包会在系统内添加/usr/bin/c++、/usr/bin/gcc、/usr/bin/g++、 /usr/bin/gfortran这么几个软连接指向默认的gcc编译器可执行文件,默认情况下就是7.5版。
openSUSE提供了alternatives系统,可以切换默认的一些程序,比如说ruby、Python的默认程序,这些都是openSUSE内置的alternatives。但是gcc不在默认清单里,而是需要手动添加。
Changing Default Compiler on OpenSuSE -- Logikal Blog
通过以下命令可以添加gcc到alternatives
bash
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 50
--install是一般命令参数
接下来的/usr/bin/gcc是软链接,而系统默认的gcc就是这个/usr/bin/gcc
gcc是alternatives里面注册的可替换项的名字
/usr/bin/gcc-13是软链接实际指向的目标
50是优先级
这样就把从第三方源安装的gcc-13所对应的可执行文件/usr/bin/gcc-13注册到alternatives的gcc项中,优先级为50,而这个gcc项在实际的系统中指的是/usr/bin/gcc
执行后,会提示
using /usr/bin/gcc-13 to provide /usr/bin/gcc (gcc) in auto mode
然后
bash
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 20
这样就把系统默认的gcc-7.5所对应的可执行文件/usr/bin/gcc-7注册到alternatives的gcc项中,优先级为20
然后使用命令
bash
update-alternatives --config gcc
按照提示选取,就可以改变/usr/bin/gcc这个软链接的指向,从而改变了系统默认的gcc
类似的可以把cpp、gfortran、g++都注册好
bash
# 有时候探测系统默认c编译器的时候,不仅仅探测gcc,还会探测cc
update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-13 50
update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-7 20
update-alternatives --config cc
# 注册c pre processor
update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-13 50
update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-7 20
update-alternatives --config cpp
# 有时候探测系统默认c++编译器的时候,除了探测g++,还可能会探测c++
# 所以要注册两个
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 50
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 20
update-alternatives --config g++
update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-13 50
update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-7 20
update-alternatives --config c++
# 注册gfortran
update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-13 50
update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-7 20
update-alternatives --config gfortran
如果一个程序在编译过程中要用到多种编译器,比如gcc和g++,那么一定要调整为同一版本,不同版本的编译器编译出来的二进制文件在链接的时候可能会出问题。
通过update-alternatives调整了系统默认编译器后,对于大多数程序,在使用编译器时,如果需要调用配套的ar、ld程序时,一般会在编译脚本里通过编译器的输出信息来选择对应的程序