1,问题的原因是gcc版本低了
如果在编译安装 NV GPU 最新的开源 driver 时遇错 error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’
那么,先执行 gcc --version 看看 gcc 的版本。
应该是<=11
有一说一,编译器选项 -ftrivial-auto-var-init=<value> 是 gcc-12 从clang借鉴过来的。
先看clang中的解释,
在 clang --help 中可以看到:
-ftrivial-auto-var-init=<value>
Initialize trivial automatic stack variables: uninitialized (default) | pattern
有图有真相:
在看gcc-12中的解释,
在 gcc-12 -v --help 中可以看到:
-ftrivial-auto-var-init=[uninitialized|pattern|zero] Add initializations to automatic variables.
有图有真相:
综上,-ftrivial-auto-var-init=zero 这个编译器的一个选项,用于初始化自动变量(即局部非静态变量)为零。这样就可以一定程度上提高代码的安全性,防止未初始化变量的使用可能导致的未定义行为或安全漏洞。
而gcc-11中没有这个选项,故不能识别。
2,解决方法:多版本gcc
安装gcc-12
这面临着安装多个版本的gcc
假如系统中已经安装了 gcc-11
那么先安装gcc-12:
sudo apt-get install gcc-12
然后使用 update-alternatives 命令切换gcc 为gcc-12,其中 update-alternatives 命令用于处理linux 系统中软件版本的切换,是一个 Linux 通用工具,各个linux发行版中基本都有。
安装 gcc-12 接下来需要继续执行如下命令:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11
从上述update-alternatives 截图可以看出,这里 update-alternatives 各个参数的含义如下:
第一个参数: --install 表示要向 update-alternatives 注册服务名;
第二个参数: 注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链;
第三个参数: 服务名,以后管理时以它为关联依据;
第四个参数: 被管理的命令绝对路径;
第五个参数: 优先级,数字越大优先级越高。
然后执行:
sudo update-alternatives --config gcc
显示如下:
根据意图,可以写0或2,以便通过gcc来启用 gcc-12
此时 直接使用gcc,则是实用 gcc-12:
ls /usr/bin/gcc
可以看出gcc是个软连接,指向 /et/alternatives/gcc;而这里的gcc 又软连接到真正的 /usr/bin/gcc-12,通过 一个适配层启用到了gcc-12,从而实现了
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
的意图。
3,命令总结
gcc --version
sudo apt-get install gcc-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11
sudo update-alternatives --config gcc
标签:bin,gcc,12,option,--,alternatives,zero,init,usr
From: https://blog.csdn.net/eloudy/article/details/143971938