因此,我安装了 gcc-4.4 和 gcc-4.3(g++ 也一样)。现在,据我记得,Ubuntu 中有一个工具,只要告诉它您想要哪个版本,它就会为您设置符号链接。然而,它似乎在最新版本中不起作用,这让我感到失望。
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 $2}'
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
在 install build-essential 之后安装。但是,我们可以明确安装以下软件包:
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 "$1" ]; then
echo "usage: $0 version" 1>&2
exit 1
fi
if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
echo "no such version gcc/g++ installed" 1>&2
exit 1
fi
update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"
答案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
答案3
这真的是可取的吗?版本之间存在 ABI 变化gcc
。使用一个版本编译某些内容(例如整个操作系统),然后使用另一个版本编译其他内容,可能会导致冲突。
例如,内核模块应始终使用与gcc
编译内核相同的版本进行编译。考虑到这一点,如果您手动更改了/usr/bin/gcc
和 Ubuntu 版本中使用的版本之间的符号链接,则未来 DKMS 构建的模块可能会使用错误的gcc
版本。
如果您只想使用不同版本的 构建内容,这很容易,即使使用 makescripts 也是如此。例如,您可以在环境变量中gcc
传入 的版本:gcc
CC
CC="gcc-4.5" ./configure
CC="gcc-4.5" make
您可能不需要在 make 命令上使用它(配置脚本通常会将其拉入)但它并没有什么坏处。
答案4
我想从 gcc/g++ 9.x (已安装)切换到 10.x:
- 安装新所需的版本:
sudo apt install gcc-10 sudo apt install g++-10
- 切换到新版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
- 测试:
gcc --version g++ --version
如果您需要切换回来,旧版本仍然会安装,只需使用第 2 行的命令和旧版本即可!