linux - 即使安装新版本并删除旧版本后也无法修改 gcc 版本

标签 linux gcc centos

我使用的是 CentOS 5.5,我的电脑到目前为止使用的是 gcc-4.1.2,在 /usr/lib/gcc/x86_64-redhat-linux/ 下有 2 个索引:4.1.1 和 4.1.2。为了使用某些软件,我必须更新 gcc。

但是当我从下载的 gcc-4.7.0.tar.gz 安装 gcc-4.7.0 后(我没有使用 yum,因为当我尝试它时,所有服务器都告诉我我有最新版本,这当然不是真的,也许这也是我现在面临的问题引起的), /usr/lib/gcc/x86_64-redhat-linux/4.7.0/ 就像 4.1.1 一样创建, 4.1.2索引,所以在/usr/lib/gcc/x86_64-redhat-linux/下有3个索引:4.1.1、4.1.2和4.7.0。在 /usr/lib/gcc/x86_64-redhat-linux/4.7.0/ 下有 6 个索引:

bin include lib lib64 libexex share

看起来4.7.0已经成功安装,但是当我运行时

gcc --version

结果还是

gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我也跑了

update-alternatives --install /usr/bin/gcc gcc /usr/lib/gcc/x86_64-redhat-linux/4.7.0 40

提高4.7.0的优先级,当我运行时

update-alternatives --config gcc

它说

There is 1 program that provides 'gcc'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/gcc/x86_64-redhat-linux/4.7.0

Enter to keep the current selection[+], or type selection number:

我打印了1,看起来像是选择了4.7.0作为默认gcc,但是当我运行gcc --version时,结果没有改变!还是4.1.2。

之后我什至通过rpm -e删除了所有4.1.2 gcc及其相关程序并删除了索引,但是gcc --version的结果变成了

-bash: gcc: command not found.

当我重新安装4.7.0时,它没有改变。

毕竟,当我查找 /usr/bin/gcc/ 的链接时,我发现了

/usr/bin/gcc -> /etc/alternatives/gcc

/etc/alternatives/gcc 的链接是

/etc/alternatives/gcc -> /usr/lib/gcc/x86_64-redhat-linux/4.7.0

这应该是我运行 update-alternatives 行的结果,所以它已经起作用了。它确实链接到了 4.7.0。那么为什么这个链接最终没有调用4.7.0呢?我查不出来。

我什至直接链接到 4.7.0:

ln -s /usr/lib/gcc/x86_64-redhat-linux/4.7.0 /usr/bin/gcc

但是这仍然不起作用。

我对此感到非常困惑。我将感谢您的帮助。非常感谢!

附:非常感谢 Basile Starynkevitch 注意到我做出这些解释:

  1. 我的 PATH 中有 /usr/bin/,所以这应该没问题。

  2. 我被告知 /usr/bin/gcc/ 应该链接到可执行文件而不是索引,因此到 4.7.0 的链接是错误的。但是谁能告诉我要链接到哪个可执行文件,或者在普通计算机中 /usr/bin/ 链接到哪个可执行文件?这很可能会导致问题的解决。

  3. 我无法再次运行configure,因为configure本身需要gcc,但现在找不到它。所以恐怕问题不能就此解决。

最佳答案

请注意PATH variable 。您可以在其中包含一些 $HOME/bin/

恢复系统的gcc(这样就可以消除你所做的所有困惑)。然后运行 ​​which gccgcc -v 来了解它到底是什么。

如果编译GCC从其源代码(如 FSF 的 distributed)中,选择一个最新版本,例如GCC 8 2018 年秋季。

仔细阅读installing GCC 。在源代码之外对其进行编译。注意许多configure选项。我建议考虑使用一些 --program-suffix 选项(例如 --program-suffix=-8)对其进行配置,然后适本地添加符号链接(symbolic link)(例如 $HOME/bin/gcc -> /usr/local/bin/gcc-8)。

ln -s /usr/lib/gcc/x86_64-redhat-linux/4.7.0 /usr/bin/gcc

这是错误的。由于 /usr/lib/gcc/x86_64-redhat-linux/4.7.0/ 是一些内部目录,并且 /usr/bin/gcc 必须是可执行文件。

您可能不需要运行update-alternatives,但您确实需要在PATH中提到的目录中(巧妙地)添加一些内容

另请参阅this answer类似的问题。

编辑问题后

您首先需要清理您在 /usr/ 下所做的困惑(特别是在 /usr/bin/ 中,如果没有软件包系统,您永远不应该更改它)。删除您在 /usr/bin//usr/lib/ 下添加的所有内容。然后强制显式重新安装适当的系统 gcc 软件包(使用yum 或其他软件包管理器)。

I have /usr/bin/ in my PATH, so this should be OK.

可能不是。我的建议是将 $HOME/bin//usr/local/bin/ 早期添加到您的 PATH 中(因此 /usr/bin/ 之前;您可能需要编辑 ~/.bashrc 来更改您的 PATH 设置)并添加新的 gcc,例如 gcc-8 (如果您从其源代码编译GCC 8),那里。如果您想要系统范围的安装,请安装一些 /usr/local/bin/gcc-8 程序。如果您想要个人安装,请安装一些 $HOME/bin/gcc-8 程序(两者都可以是到其他地方的绝对符号链接(symbolic link))。

关于linux - 即使安装新版本并删除旧版本后也无法修改 gcc 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53020446/

相关文章:

MySQL备份并删除旧备份

c - Openssl:RSA_verify() 支持什么 RSA 签名方案?

c++ - 如何创建可维护性高的共享对象?

python - 使用 python 收集远程服务器 (linux) 指标

python - Venv 在 CentOS 中失败,确保 pip 丢失

ruby-on-rails - 使用 nginx 和 unicorn : 403 forbidden error 进行 rails 部署

linux - Poppler 0.14.1 构建问题

java - 在 linux 中使用 java 执行 C 程序目标代码

gcc - 夹板与 gcc : are external static code analysis tools worth the effort for C codebases?

c++ - Festival TTS API/CodeBlocks 构建问题!