由导学宝转自: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临时空间。此文中若有错误或缺陷,望指出。)
毕。