编译GCC及其多版本并存控制

由导学宝转自:http://hi.baidu.com/ruikflyer/blog/item/d43a8ec341c88d5eb219a875.html
无论是作为一名Linux Geek,或是面向Linux的软件工程师,还是嵌入式Linux开发人员,我们都离不开GCC,GCC在Linux中的重要性,从gcc-${version}-base软件包便知道其有多霸道了。而对开发人员来说,编译程序自然更离不开GCC了,并且对于有的软件包,有可能只针对特定版本的GCC,或许是一个版本很老的GCC(因为随着GCC的成长,它更加成熟,更加标准化,以前开发的软件包,可能会依赖当时的GCC版本,虽然能通过当时的GCC编译,然而却不能通过当前较新版本的编译检察),于是,我们不得不使用不同版本的GCC编译器。



说了这么多,只为说明一个问题:我们可能会经常使用不同版本的GCC,而且我们可能要通过GCC源码,手动编译安装,其主要原因有如下两点:

1.针对不同分发版的Linux,不一定能马上找到其支持的二进制安装包,然而源码包却很容易在gnu.org上得到。

2.现有编译好的二进制包配置不符合我们要求,我们需要重新编译,配置编译参数,定制我们想要的GCC。



有了多个版本的GCC编译器,我们又如何方便快捷地管理它们呢?如果管理得不好,GCC的toolchain错乱,多个版本之间相互调用中间处理程序(如cpp, compile pre-processing等),有可能因此编译一个程序老半天,看着make的一大堆莫名其妙的错误输出,足以让我们郁闷半天。



所以,编译安装GCC重要,管理好不同版本GCC共存更重要。



我现在便以编译最近的gcc-4.4.0为例,讲解编译gcc的一般流程,及管理不同版本gcc共存的方法。



Step 1:

下载源码包,比如我下的gcc-4.4.0.tar.bz2.

然后解压:

$ tar xjvf ./gcc-4.4.0.tar.bz2



Step 2:

创建一个编译工作目录,有的建议在源码的同级下建一个目录,也有的建议直接在源码目录下新建编译工作目录,我选择的后者,先进入源码目录:

$ cd gcc-4.4.0

$ mkdir ./build

$ cd ./build



Step 3:

这就进入了常规的configure过程:(此过程成功与否,往往和你当前机器中安装的软件包有关,如果检查依赖关系错误,提示少什么依赖,那就找到相应版本要求的软件包,安装即可)

$ ../configure --prefix=/usr/gcc-4.4.0 --enable-languages=all --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --enable-libgomp



Step 4:

此步是满足Step 3中的依赖关系。若Step 3顺利,configure成功执行并生成Makefile,此步骤便可略过。由于我编译过程中缺少gmp和mpfr依赖,于是我便作了如下操作:

一、安装gmp(传统过程) 

下载到gmp软件包,然后执行:

$ tar xjvf ./ gmp-4.3.0.tar.bz2

$ cd ./ gmp-4.3.0

$ ./configure --prefix=/usr/local/gmp

$ make

$ make check

# make install

$ make distclean



二、安装mpfr(依然是传统过程)

依然下载到mpfr软件包,然后执行:

$ tar xjvf ./mpfr-2.4.1.tar.bz2

$ cd ./ mpfr-2.4.1

$ ./configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp

$ make

$ make check

# make install

$ make distclean



三、重新执行刚才没有成功的Step 3:

$ export LD_RUN_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib
$ export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib
$ LD_RUN_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib LD_LIBRARY_PATH=/usr/local/lib:/usr/local/mpfr/lib:/usr/local/gmp/lib
$ ../configure --prefix=/usr/gcc-4.4.0 --enable-languages=all --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --enable-libgomp

(若不想以后每次编译时都写这么一大堆,可以参考我前一篇日志《Linux启动过程中几个重要配置文件的执行过程》将这些环境变量写在配置文件中)

成功执行后,生成Makefile。



Step 5:

前面做了很多工作,现在可以轻松一下,此步一个命令就搞掂。

$ make



Step 6:

如果Step 5中的make成功,那么就略过,否则就要根据make错误提示,找出问题,解决后重新编译。



Step 7:

编译完成后,我们只用安装了:

#make install



Step 8:

清理工作:

$rm -rf *





这就是我编译gcc-4.4.0的全过程,途中遇到好几个问题,但解决的过程太杂,反正都是一阵google,步骤都体现在了Step 4及Step 6中,为了使整个过程清晰,我便没有写出来了,因为过于specific无用。总之,遇到问题不用急,充分利用google和各大Linux论坛,问题总会解决的。下面给一个链接,是我当时编译时,两个问题的答案都从此文得到:

Unix Linux Forums:http://fixunix.com/solaris/490396-gcc-build-fails-cannot-compute-suffix-object-files.html 





编译好了之后,那么我们系统中至少将会有两个版本的GCC:一个是我们现在编译好的,还有一个是刚才用到的以前版本的GCC,那么我们如何方便地从这几个版本进行切换呢?



一种粗劣的方法是手动用ln -s创建symbolic来管理,但这样费时费力,而且容易导致toolchain混乱。



幸好有update-alternatives实用软件!它可以方便管理好同一软件的各个不同版本。



1.一般情况下,编译程序路径都是使用
/usr/bin/gcc
其实这个/usr/bin/gcc只是个符号链接,它指向了/etc/alternatives/gcc,而/etc/alternatives/gcc是指向了/usr/bin/gcc-4.3,可以用ls命令查看
z@GODSON:~$ ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 21 2009-04-28 13:35 /usr/bin/gcc -> /etc/alternatives/gcc
z@GODSON:~$ ls -l /etc/alternatives/gcc
lrwxrwxrwx 1 root root 16 2009-04-28 13:40 /etc/alternatives/gcc -> /usr/bin/gcc-4.3



2.现在我们使用update-alternatives管理我们的GCC版本:

z@GODSON:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/gcc-4.4.0/bin/gcc 50

z@GODSON:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 40
z@GODSON:~$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 30

这样,我们就已经把我们安装的三个GCC版本向update-alternatives注册了,接下来我们便可以方便地管理各版本切换。



3.切换版本
切换版本到gcc-4.4.0:

z@GODSON:~$ sudo update-alternatives --config gcc
[sudo] password for z:

现有 3 个可选项,它们都提供了“gcc”<

选择 可选项
-----------------------------------------------
*+ 1 /usr/gcc-4.4.0/bin/gcc
2 /usr/bin/gcc-4.3
3 /usr/bin/gcc-4.1

要维持缺省值[*],按回车键,或者键入选择的编号:



输入想要切换的版本,回车之后就OK了,然后你可以用gcc --version查看版本。



(注:操作过程中,有"#"提示符的部分,需要提升权限,一般使用根用户或者sudo即可。编译gcc-4.4.0需要至少2G临时空间。此文中若有错误或缺陷,望指出。)



毕。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值