Ubuntu下多个gcc版本切换总结
- seanloo
- 2019-04-30
- 教程/笔记
- 6065浏览
- 0评论
今天在编译项目分支的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*:
最后,我们需要下载我们想要的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
ubuntugcclinux
本站文章除注明转载/出处外,均为本站原创或翻译。若要转载请务必注明出处,尊重他人劳动成果共创和谐网络环境。
转载请注明 : 文章转载自 » 心诺设计风尚 » 教程/笔记 » Ubuntu下多个gcc版本切换总结