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

相关推荐
MZWeiei几秒前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
7yewh16 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
小张认为的测试20 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
打鱼又晒网28 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
良许Linux42 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
蜜獾云1 小时前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维1 小时前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
bitcsljl1 小时前
Linux 命令行快捷键
linux·运维·服务器
ac.char1 小时前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架