你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux升级GCC 4.8.1清晰简明教程(Ubuntu 12.04 64位版为例)

[日期:2014-04-05] 来源:Linux社区  作者:yanxiangtianji [字体: ]

二,配置(configure)
1,建立编译目录
在gcc解压根目录下创建一个用于存放编译时生产的.o文件的目录。

mkdir build
cd build

2,配置
在刚刚建立的临时目录里面,调用根目录下下的configure,并输入其他参数,这里我只介绍常用的几个。
--prefix
用于配置make install之后将生产的可执行文件、库文件放到哪个根目录下,例如--prefix=/usr,那么生产的gcc和g++会放在/usr/bin下,生产的lib会放在/usr/lib下。如果你希望替换掉原来的gcc和lib,那么使用通过“which gcc”命令找到的根路径。默认情况下--prefix为/usr/local。可以通过update-alternatives来配置拥有多个gcc时默认使用哪一个(后面介绍)。
--program-prefix
--program-suffix
给编译出来的gcc加上前缀和后缀。例如--program-prefix=my- --program-suffix=-4.8.1,那么生成的gcc的名字会是:“my-gcc-4.8.1”
--disable-multilib
使编译出来的gcc成为本地编译器(native compiler),即生产的目标代码只保证能在本机默认运行。
对于64位的系统,这个选项是默认关闭的,即默认情况下得到的gcc可以通过编译时的选项(-m32)来决定生成64位还是32位的目标代码。所以需要先安装gcc-multilib(glibc-devel.i686)。对于32位系统,默认是开启的,即不去生成64的程序。
--enable-languages
这个就是说明需要让编译出来的gcc支持的语言。和大多数人一样,对于gcc我只用它的c和c++,其他语言没有配置,所以不保证本文档对于编译其他语言的情况也是正确的。
--with-gmp
--with-mpfr
--with-mpc
--with-isl
--with-cloog
--with-gmp-include
--with-gmp-lib

如果已经安装了上述某个库,且不再标准的库搜索路径(自动安装一般不存在这个问题),需要手动指定相应路径。
--with-XXX=YYY等价于--with-XXX-include=YYY/include 和 --with-XXX-lib=YYY/lib


假设系统为64位的,当前gcc安装在/usr/bin目录下:
例如(作为本地编译器,共存两个gcc,支持c和c++):

../configure --prefix=/usr/local --disable-multilib --enable-languages=c,c++

或(可以生成32位可执行文件,覆盖原来的gcc,支持c和c++,自行编译了gmp到/usr/gmp-5.1.3/下):

../configure --prefix=/usr --enable-languages=c,c++ --with-gmp=/usr/gmp-5.1.3

3,检查
即使存在一些问题,confiure也是可以成功生成Makefile文件的,但是这些问题会导致后面的make过程出错。因而很多人(包括我)忽略了这一步,导致了一些令人头痛的问题。
打开与Makefile文件同时生成的config.log文件,搜索里面的“error”,正常情况下只会搜到一些条件信息里面的error如-Werror,和获取信息时使用“gcc -V”但gcc不支持-V之类的错误,这些无关大局。但如果出现了include某个文件不存在,那就需要注意了。例如#include<isl/xxx.h>出错,就说明没有安装libisl-dev包。
三,编译(make)
到了这一步,就没什么那么麻烦了:

sudo make -j4

对于更好的机器-j后面的数字可以更大一些。
没有问题后,执行:

sudo make install

install的路径是在configure的时候配置的。


需要说明的是:
1,gcc 不支持make unintall,覆盖请谨慎。
2,这一步请使用root权限进行,否则必悲剧。


四,后继工作
如果希望共存两个版本的gcc,使用的时候自然可以通过输入完整路径来致命调用哪个gcc,但是这样比较复杂。

建议通过update-alternatives 来让系统知道当我们只输入gcc的时候,是希望调用哪一个(关于update-alternatives的详细用法请百度):

例如我的gcc的路径为/usr/local/bin/gcc,我给它一个100的优先级:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc 100

然后通过

sudo update-alternatives --config gcc

来查看两个gcc中系统选中了哪个(auto情况下是选中优先级高的),如果auto选中的不是我们要的,可以增加优先级或者手工制定默认的。

Ubuntu下的shell命令总结:
假设已经把gcc解压了,并且进入了相应目录。

sudo apt-get install gcc g++ make
sudo apt-get install libisl-dev libcloog-isl-dev
#若希望在64位系统下编译出32位应用程序(反之亦然),需要执行下面命令
sudo apt-get install gcc-multilib g++-multilibsudo ./contrib/download_prerequisitessudo mkdir buildcd buildsudo ../configure --enable-languages=c,c++sudo make -j4sudo make install

在其他Linux版本:
 
在升级gcc个过程中,主要区别就在于包的名字和包管理器的不同。

Ubuntu系(Debian)的包名和RedHat系(CentOSFedora)的在命名规则上不太一样。前缀洗好加版本号,开发版缩写为“dev”,用“-”连接架构;而后者的开发版缩写为”devel“,用”.“连接架构。
 
例如在安装32位的glibc的时候所使用的报名:
 
On Ubuntu: libc6-dev-i386.
 On Red Hat distros: glibc-devel.i686
 On CentOS 5.8: glibc-devel.i386
 On CentOS 6.3: glibc-devel.i686

其次Ubuntu系有很多整合了的包,例如g++-multilib,build-essential等,而ReadHat系没有。

更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

linux
相关资讯       gcc 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款