如何在Ubuntu中更改默认的GCC编译器?
我已经在Ubuntu 11.04上安装了gcc-3.3 / g ++ – 3.3,它已经有了gcc / g ++ – 4.4。 所以在我的系统中,gcc-3.3和4.4都可用。 我可以根据需要调用两个编译器。 如果我只是调用gcc
命令,那么gcc-4.4会被调用。 要调用gcc-3.3,我必须使用gcc-3.3
命令。
如何将默认编译器更改为gcc-3.3? 当我执行gcc
命令时,它应该调用gcc-3.3而不是gcc-4.4。
另外,如何将make文件中的variablesCXX更改为gcc-3.3? 我希望在系统中改变一个通用的全局位置,而不是改变所有的make文件。
正如@Tommy所build议的那样,您应该使用update-alternatives
。
它为一个系列的每个软件赋值,以便定义应用程序的调用顺序。
它用于维护系统上相同软件的不同版本。 在你的情况下,你将能够使用gcc
几个declinations,而且会受到青睐。
要弄清楚gcc的当前优先级,请input@tripee的注释中指出的命令:
update-alternatives --query gcc
现在注意gcc-4.4
的优先级,因为你需要给gcc-3.3
一个更高的优先级。
要设置你的select,你应该有这样的东西(假设你的gcc
安装位于/usr/bin/gcc-3.3
,而gcc-4.4
的优先级小于50) :
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50
– 编辑 –
最后,您还可以使用update-alternatives
的交互式界面轻松切换版本。 inputupdate-alternatives --config gcc
将被要求select你想要使用的gcc版本。
– 编辑2 –
现在,为了修复系统中的CXX环境变量,您需要将@ DipSwitch所指示的行放在.bashrc
文件中(这将只对您的用户进行更改,这在我看来更安全):
echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
下面是jHackTheRipper为TL,DR人群提供的答案的完整示例。 :-)在这种情况下,我想在默认为4.6的Ubuntu系统上运行g ++ – 4.5。 作为root
:
apt-get install g++-4.5 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100 update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50 update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100 update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50 update-alternatives --set g++ /usr/bin/g++-4.5 update-alternatives --set gcc /usr/bin/gcc-4.5 update-alternatives --set cpp-bin /usr/bin/cpp-4.5
在这里,4.6仍然是默认的(又名“自动模式”),但我明确地切换到4.5暂时(手动模式)。 回到4.6:
update-alternatives --auto g++ update-alternatives --auto gcc update-alternatives --auto cpp-bin
(请注意使用cpp-bin
而不是cpp
,Ubuntu已经有了一个cpp
备选scheme,并且链接为/lib/cpp
,重命名该链接将删除/lib/cpp
链接,这可能会破坏脚本。
这是如何创build和pipe理主和从(gcc和g ++)备选scheme的详细说明和分步说明。
不久之后:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 sudo update-alternatives --config gcc
现在,Ubuntu /精确可以使用gcc-4.9。
在发行版编译器具有更高优先级的情况下创build一组编译器替代scheme:
root$ VER=4.6 ; PRIO=60 root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO root$ VER=4.9 ; PRIO=40 root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO
注:使用gcc版本开关自动更改g ++版本。 cpp-bin必须单独完成,因为存在“cpp”主select。
列出可用的编译器选项
root$ update-alternatives --list gcc root$ update-alternatives --list cpp-bin
要手动selectgcc,g ++和cpp版本4.9,请执行:
root$ update-alternatives --config gcc root$ update-alternatives --config cpp-bin
检查编译器版本:
root$ for i in gcc g++ cpp ; do $i --version ; done
恢复发行版编译器设置(这里:返回到v4.6):
root$ update-alternatives --auto gcc root$ update-alternatives --auto cpp-bin
如果你想要一个更快(但仍然非常干净)的方式来达到个人目的(例如,如果你想build立一个具有对编译器版本的强烈要求的特定项目),只需按照以下步骤:
- input
echo $PATH
并寻找一个具有非常高优先级的个人目录(在我的例子中,我有~/.local/bin
); - 在此目录中添加符号链接:
例如:
ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++
当然,这对于单个用户来说(这不是一个系统范围的解决scheme)是有效的,但另一方面,我不喜欢在我的安装中更改太多东西。
我试图安装新的clang编译器时发现这个问题。 原来, Debian和LLVM的维护者都同意替代系统应该用于替代品,而不是用于版本控制 。
他们提出的解决scheme是这样的:
PATH=/usr/lib/llvm-3.7/bin:$PATH
其中/usr/lib/llvm-3.7/bin是由llvm-3.7软件包创build的目录,其中包含所有具有非后缀名称的工具。 因此,llvm-config(版本3.7)在其PATH中以其普通名称出现。 不需要使用符号链接,也不需要调用安装在/ usr / bin中的llvm-config-3.7。
另外,请检查名为llvm-defaults(或gcc-defaults)的软件包,这可能会提供其他方法来执行此操作(我没有使用它)。
我只使用下面的行,它的工作。 我只是想在Ubuntu 14.04
上使用kernel 4.8.10
编译VirtualBox
和VMWare WorkStation
。 最初,大多数东西都不能用于例如graphics和networking。 我很幸运VMWare workstation
要求使用gcc 6.2.0
。 我无法启动我的Genymotion Android emulators
因为virtualbox已closures。 如有必要,稍后将发布结果。
VER=4.6 ; PRIO=60 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER VER=6 ; PRIO=50 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER VER=4.8 ; PRIO=40 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
4.8和6之间的所有 – --slaves
:
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \ 10 \ --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 \ --slave /usr/bin/gcov gcov /usr/bin/gcov-4.8 \ --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \ --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \ --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8
和
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \ 15 \ --slave /usr/bin/g++ g++ /usr/bin/g++-6 \ --slave /usr/bin/gcov gcov /usr/bin/gcov-6 \ --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \ --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \ --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6
使用update-alternatives --config gcc
更改它们。