Ubuntu下多个gcc版本切换总结

今天在编译项目分支的X86版本的时候,在自己的机器Ubuntu14.04上是没有任何问题,有些小问题,自己通过修改makefile和c文件得到了解决,但是在同事的ubuntu16.04下面总是出现奇怪的报错(两个问题,一个是声明但未定义的inline函数的警告报错;

另外一个是函数undefined reference),一开始则怀疑是gcc版本太高导致,但是心里总是想把那两个问题解决掉,最终在这里耗了一个小时的时间,第一个问题的解决办法是去掉警告报错的-Werror参数,可以解决,第二个还是没有办法(怀疑是找库的时候找不到导致),最终只能妥协。

选择的办法是将Ubuntu16.04上预装的gcc-5.4版本降低到我们现在都使用的gcc-4.8版本(之前用过gcc-4.7,此处会因为找不到某些库而报错,因为之前都是在gcc-4.8的环境下生产的so动态库,在低版本的环境中,可能链接找不到动态库。因为之前都是在gcc-4.8的环境下生产的so动态库,在低版本的环境中,可能链接找不到动态库。)

总结:建议使用大家都使用的gcc版本,不用太高也不要太低,否则会导致工作效率低下,一直在折腾一个问题

多个gcc共存且相互切换的方法

首先查看我们系统中当前正在使用的gcc版本:gcc -v查看版本信息

gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

其次,需要查看我们系统中目前有哪些版本的gcc:

ls /usr/bin/gcc*:

QQ截图20190430171235.png

最后,我们需要下载我们想要的gcc-4.8版本:

apt-get install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib

(建议gcc gcc++都下载)。

现在系统里就有多个我们需要的gcc版本了。如何切换版本?

1、添加gcc选项并设置命令优先级:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100

这个可以设置我们命令的优先级为100(当我们选择自动模式的时候,我们的优先级就起作用)。

2、选择版本:

update-alternatives --config gcc
root@lxy-ChengMing-3967 /home/lxy/test/NGFW_D4.4_SLB/src # update-alternatives --config gcc
There are 3 choices for the alternative gcc (providing /usr/bin/gcc).
  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-4.8   100      auto mode
  1            /usr/bin/gcc-4.7   50        manual mode
  2            /usr/bin/gcc-4.8   60        manual mode
  3            /usr/bin/gcc-5     40         manual mode
Press <enter> to keep the current choice[*], or type selection number:

现在可以输入想要的数字选择gcc版本了。

从上述可以看出,如果是auto mode模式,那么gcc-4.8则是我们想要的版本,如果想选择gcc-5,那么输入3即可,此时就进入手动模式。

选择之后就可以通过gcc -v来查看当前gcc版本了。

3、删除之前添加的4.8版本的可选项的操作:

update-alternatives --remove gcc /usr/bin/gcc-4.8

知识扩展:

关于update-alternatives命令的使用

现在介绍下 update-alternatives 命令中的几个主要选项,diplay、install、remove、config:

1、display选项的功能就是查看一个命令链接组的所有信息,包括链接的模式(自动还是手动)、链接priority值、所有可 用的链接命令等等。

使用语法:

update-alternatives --display name ,其中name为命令链接名称,

如gcc,执行命令: update-alternatives --display gcc 将会出现类似下面的结果

gcc - auto mode
link best version is /usr/bin/gcc-4.8
link currently points to /usr/bin/gcc-4.8
link gcc is /usr/bin/gcc
/usr/bin/gcc-4.7 - priority 50
/usr/bin/gcc-4.8 - priority 60
/usr/bin/gcc-5 - priority 40

2、install选项的功能就是增加一组新的系统命令链接符了,使用语法为:

update-alternatives --install link name path priority [--slave link name path]...

其中link为系统中功能相同软件的公共链接目录,比如/usr/bin/gcc(需绝对目录); 

name为命令链接符名称,如gcc; 

path为你所要使用新命令、新软件的所在目录; 

priority为优先级,当命令链接已存在时,需高于当前值,因为当alternative为自动模式时,系统默认启用priority高的链接; 

--slave为从alternative。

alternative有两种模式:auto和manual,默认都为auto模式,因为大多数情况下update-alternatives命令都被postinst (configure) or prerm (install)调用的,如果将其更改成手动的话安装脚本将不会更新它了。

3、remove选项的功能是删除一个alternative及相关从alternative,使用语法为:

update-alternatives --remove name path

其中name与path与install中的一致,如果所删除的链接组中还有其他链接的话,系统将会自动从其他中选择一个priority高的链接作为默认为链接。

4、config选项功能为在现有的命令链接选择一个作为系统默认的,使用语法为:

update-alternatives --config name

如执行:

sudo update-alternatives --config gcc

将会有类似以下信息:

There are 3 choices for the alternative gcc (providing /usr/bin/gcc).
Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-4.8   60        auto mode
  1            /usr/bin/gcc-4.7   50        manual mode
  2            /usr/bin/gcc-4.8   60        manual mode
  3            /usr/bin/gcc-5     40        manual mode
Press <enter> to keep the current choice[*], or type selection number:

若是想将manual改回自动模式的话,执行命令: update-alternatives --auto name即可,例如 

update-alternatives --name gcc

发表评论

(必填)

(必填)

(选填)

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新发布

热门讨论

最近留言