root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.
root@nexus:~# dpkg -l | grep gcc | awk '{print }'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1
有什么想法吗?
#1 楼
首先擦除update-alternatives
和gcc
的当前g++
设置:sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
安装软件包
似乎在安装构建后同时安装了
gcc-4.3
和gcc-4.4
-必要。但是,我们可以显式安装以下软件包:sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4
安装替代方法
符号链接
cc
和c++
默认安装。我们将为gcc
和g++
安装符号链接,然后分别将cc
和c++
链接到gcc
和g++
。 (请注意,10
,20
和30
选项是每个替代方案的优先级,数字越大优先级越高。)sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++
配置替代方案
最后一步是为
gcc
和g++
配置默认命令。交互式地在4.3和4.4之间切换很容易:sudo update-alternatives --config gcc
sudo update-alternatives --config g++
或使用脚本进行切换:
#!/bin/sh
if [ -z "" ]; then
echo "usage: q4312079q version" 1>&2
exit 1
fi
if [ ! -f "/usr/bin/gcc-" ] || [ ! -f "/usr/bin/g++-" ]; then
echo "no such version gcc/g++ installed" 1>&2
exit 1
fi
update-alternatives --set gcc "/usr/bin/gcc-"
update-alternatives --set g++ "/usr/bin/g++-"
评论
Thx,所以您必须手动将它们添加到更新替代项。.IIRC早期的Ubuntu版本会自动执行此操作。
–指甲
2011-2-15在19:33
当为不同的内核编译nvidia模块时,这对我特别有用。非常感谢您解释更新方案
–earthmeLon
2012年4月15日上午10:57
谢谢!我用您的其他答案将4.6更新为4.7。我想用这个答案,但是我不确定为什么要在某些命令之后加上数字10 20 30。你能解释一下吗?
–马丁·卓兹迪克(Martin Drozdik)
2012-12-28 22:02
根据手册,事实证明,这些数字是优先事项。我想在卸载其中一个版本的情况下,它将使用这些优先级来确定哪个应成为新的默认值。
–易卜拉欣
13年1月14日在20:04
@易卜拉欣:不,当您选择自动模式时,它们会确定选择了什么
– Cookie
2014年3月24日16:25
#2 楼
在终端中执行:gcc -v
g++ -v
好的,那部分相当简单。棘手的是,当您发出命令GCC时,它实际上是所使用的GCC版本的符号链接。这意味着我们可以创建从GCC到所需GCC版本的符号链接。
您可以看到符号链接:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
因此,我们需要做的是删除GCC符号链接和G ++符号链接,然后重新创建链接到GCC 4.3和G ++ 4.3的链接:
rm /usr/bin/gcc
rm /usr/bin/g++
ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
现在,如果再次检查符号链接,我们将看到GCC和G ++现在已链接到GCC 4.3和G ++ 4.3:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
最后,我们可以再次检查GCC -v并确保使用正确的版本:
gcc -v
g++ -v
评论
正是我想要的!忘记了将“ gcc”符号链接到我已安装的任何版本的功能。谢谢!
–CalebHC
19年3月1日在18:01
更简单,更简单,更安全的方法!
–ailfish009
19年7月17日在1:16
代替ls -la / usr / bin | grep g ++-4.4使用ls -la /usr/bin/g++4.4*,它更短,更快,更安全
–phuclv
20-10-27在8:19
#3 楼
这真的可取吗?在gcc
版本之间有ABI更改。使用一个版本(例如整个操作系统)进行编译,然后使用另一版本进行其他编译,可能会导致冲突。例如,内核模块应始终使用与以前版本相同的gcc
版本进行编译。编译内核。考虑到这一点,如果您手动更改了/usr/bin/gcc
和Ubuntu版本中使用的版本之间的符号链接,则将来DKMS构建的模块可能会使用错误的gcc
版本。如果您只想构建东西使用不同版本的
gcc
,即使使用脚本也很容易。例如,您可以在gcc
环境变量中传入CC
的版本:CC="gcc-4.5" ./configure
CC="gcc-4.5" make
make命令可能不需要它(配置脚本通常将其拉入),但不会造成伤害。
评论
感谢您的评论。我知道CC变量,但这并不是问题所在。
–指甲
2011-2-15在16:31
的确如此,但是我已经解释了为什么gcc不是替代系统的一部分,以及为什么它不是特别理想。如果这些都不改变主意,则只需手动进行即可。
–奥利♦
2011-2-15在16:43
是以前吗?现在他们刚刚将其删除了吗?完全可以使用具有不同gcc版本的编译(用户空间)软件。
–指甲
2011-2-15在18:12
您能否解释为什么每次调用环境变量优于系统范围的配置设置? $ sudo apt-get install gcc-6 gcc-7 $ CC =“ gcc-7” ./configure <大量输出> $ make#使用gcc-7,而sudo update-alternatives gcc gcc-7可以确保您不会不会意外切换ABI。
– kfsone
17年6月12日在22:01
#4 楼
编辑:这假定您首先安装了该版本,例如:
sudo apt install gcc-4.9 g++-4.9
原件:
这是针对那些懒惰者的一线工具,只需将数字更改为所需的版本即可。它将更改gcc和/或g ++。
ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++
sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib
" "/usr/bin/${link}"; done' 4.9
" "/usr/bin/${link}"; done' 4.9
在此示例中,我切换到4.9
,没有错误检查,什么没有在此示例中没有,因此您可能需要在运行之前检查将要运行的内容。只需在sudo之前添加echo。为了完整起见,我还提供了检查行:
gcc --version
检查的输出应类似于:
q4312078q
可以使用以下命令检查版本:
q4312078q
半详细说明:
ls -la / usr / bin /列出/ usr / bin中的所有文件
|将输出通过管道发送(发送)到下一个命令
grep -oP匹配每行搜索正则表达式。 o仅显示结果,而不显示整个匹配行。 P告诉grep使用perl-regex。我不会在这里讨论正则表达式,如果需要的话,请继续阅读。
xargs简单地说,它收集传递给它的结果并将所有结果发送到最后。即执行xargs
之后的命令bash好了。 c标志告诉它使用字符串作为命令。在此示例中,它通过跳过第一个(第0个)参数来循环从xargs发送的参数,在这种情况下,循环跳过4.9。在循环中使用第0个参数来更改链接。
ln -s -f s标志建立符号链接,如果需要,f强制首先取消链接。
评论
很老的问题,但是这个答案似乎是我们在审查旧帖子的答案时应该寻找的宝石之一...
–mook765
16-10-16在7:12
辉煌!最好的答案放手!
–加百利·斯台普斯
18年1月15日在4:04
#5 楼
我通常还将相关的gcc工具(gcc-ar
,...)配置为从属,因此您可以一次切换所有它们:sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10 \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.3 \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.3 \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.3
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20 \
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.4 \
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.4 \
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.4
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20
,然后选择默认值之一:
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
#6 楼
临时目录中的符号链接如何:
mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++
评论
我必须承认:这是一个很好的答案。
–user643722
19-09-25在19:28
评论
正如@Oli解释的那样,这是个坏主意。 Debian-devel邮件列表:“我不认为应该使用替代版本进行版本控制。例如,对于gcc,我们不对Python使用替代物。” listing.debian.org/debian-devel/2014/06/msg00381.html好的,那么您使用什么来进行版本控制?