openSUSE变更默认编译器

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程序时,一般会在编译脚本里通过编译器的输出信息来选择对应的程序

相关推荐
虎头金猫4 分钟前
如何在Linux上使用Docker在本地部署开源PDF工具Stirling PDF:StirlingPDF+cpolar让专业操作像在线文档一样简单
linux·运维·ubuntu·docker·pdf·开源·centos
努力学习的小廉1 小时前
深入了解linux系统—— 线程同步
linux·服务器·数据库·算法
2301_810154551 小时前
VM中CentOS 7密码重置
linux·运维·centos
zhaqonianzhu1 小时前
Linux GPIO 使用 Pinctrl 及 Gpiolib 通俗详解
linux·安卓
骄傲的心别枯萎2 小时前
RV1126 NO.16:通过多线程同时获取H264和H265码流
linux·c++·音视频·rv1126
空灵之海2 小时前
Ubuntu系统安全合规配置
linux·ubuntu·系统安全·1024程序员节
喜欢你,还有大家2 小时前
FTP文件传输服务
linux·运维·服务器·前端
czhc11400756632 小时前
LINUX99 centos8:网络 yum配置;shell:while [ $i -ne 5 ];do let i++ done
linux
会开花的二叉树4 小时前
彻底搞懂 Linux 基础 IO:从文件操作到缓冲区,打通底层逻辑
linux·服务器·c++·后端
呼啦啦5614 小时前
【Linux】权限
linux·权限