Ubuntu手动编译GCC
郑重声明:本文是笔者根据个人理解所写,错误难免,欢迎拍砖!
可以任意转载、修改,转载时是否标明出处,随君而定!
系统环境
操作系统: Ubuntu 10.04 LTS - Lucid Lynx
内核版本: 2.6.35-32-generic i686 GNU/Linux
系统gcc版本: gcc (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 4.4.5
一、准备工作
编译GCC需要用到3个软件包:GMP, MPFR, MPC。之所以建议先安装这3个软件包,是因为在使用./configure配置的时候,可能会遇到如下错误:
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.
1.1 安装GMP
因为MPFR和MPC都依赖于GMP包,所以首先安装GMP。
$ tar -xvf gmp-5.0.5.tar.bz2
建议:在Linux下手动编译软件时,要养成建立build目录的好习惯,所以建立一个gmp-5.0.5-build目录
1 $ mkdir gmp-5.0.5-build 2 $ cd gmp-5.0.5-build 3 $./../gmp-5.0.5/configure (可以使用配置参数--prefix=指定安装位置,这里使用默认 /usr/local/include 和/usr/local/lib) 4 $make 5 $make check (这一步用来确保编译正确) 6 $sudo make install
如果在执行configure的时提示错误:
checking for suitable m4... configure: error: No usable m4 in $PATH or /usr/5bin
说明我们还要安装m4这个库。
1 $ tar -xvf m4-1.4.16.tar.bz2 2 $ mkdir m4-1.4.16-build 3 $ cd m4-1.4.16-build 4 $ ./../m4-1.4.16-build/configure 5 $ make 6 $ make check 7 $ sudo make install 8 $ man m4 (如果可以成功man m4,就说明这个库安装成功)
安装完m4后,我们继续回到之前gmp-5.0.5-build的目录,继续进行configure操作。
检查GMP是否安装成功:
$ ls /usr/local/lib/libgmp*
出现以下表示成功了:
/usr/local/lib/libgmp.a /usr/local/lib/libgmp.so.10 /usr/local/lib/libgmp.la /usr/local/lib/libgmp.so.10.0.5 /usr/local/lib/libgmp.so
1.2 安装MPFR
1 $ tar -xvf mpfr-3.1.1 2 $ mkdir mpfr-3.1.1-build 3 $ cd mpfr-3.1.1-build 4 $ ./../mpfr-3.1.1/configure --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib 5 (由于mpfr依赖于gmp这个库,所以在configure时,需要设置好gmp库所在的位置,供安装mpfr库时使用。) 6 $ make 7 $ make check 8 $ sudo make install
1.3 安装MPC
1 $ tar -xvf mpc-1.0.1 2 $ mkdir mpc-1.0.1-build 3 $ cd mpc-1.0.1-build 4 $ ./../mpc-1.0.1/configure --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/loca/lib 5 $ make 6 $ make check 7 $ sudo make install
1.4 设置环境变量
需要的库都安装完后,为了防止编译gcc时找不到这三个库,所以需要确认库位置是否在环境变量中 LD_LIBRARY_PATH中
$ echo $LD_LIBRARY_PATH
如果没有的话,手动添加即可
1.4.1 临时办法
$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
1.4.2 永久办法
为了以后使用的时候不再设置,可以修改/etc/bashprofile或者/etc/profile。这里修改的是全局变量,对所有用户有效,
修改~/.bashprofile 和~/.profile可以修改用户的全局变量。
$ sudo vim /etc/profile
在文件末尾添加以下两句:
export LD_LIBRARY_PATH=/usr/local/lib LD_LIBRARYPATH=:/usr/local/gcc-4.7.2/lib:$LD_LIBRARYPATH
保存退出
$ source /etc/profile
二、开始安装GCC
$ tar -xvf 4.7.2.tar.bz2 $ mkdir gcc-4.7.2-build $ cd gcc-4.7.2-build $ ../gcc-4.7.2/configure --prefix=/usr/local/gcc-4.7.2 --enable-threads=posix --disable-checking --enable-languages=c,c++,objc (详细信息请前往 http://gcc.gnu.org/install/configure.html) $ make
如果出现错误:
gengtype.c:923: undefined reference to `lexer_line'
解决办法:
1 $ sudo apt-get install build-essential bison flex 2 $ make clean (清除下之前没成功编译的文件) 3 $ make (继续make)
又遇到错误:
gengtype.c:923: undefined reference to `lexer_line'
查看build目录下的config.log (查看log真的很有用!),发现问题:conftest.c:10: fatal error: ppl_c.h: No such file or directory
此时需要安装ppl和cloog两个库.
1 $ sudo apt-get install libppl0.10-dev 2 $ sudo apt-get install libcloog-ppl-dev
完了之后:
1 $ make distclean (make clean和make distclean的区别可以上网了解一下) 2 $ make 3 $ make check (保险起见)
结果又有错误: /bin/bash: autogen: 未找到命令
需要安装autogen这个库!
1 $ sudo apt-get install autogen 2 $ make check (慢慢等吧,我的差不多编译了快2个小时,可能是机子比较垃圾吧)
总算是没什么问题了。接着我们
1 $ sudo make install
三、为GCC设置链接
接者我们用gcc -version 查看,版本还是原来的gcc4.4,并没有gcc4.7.2,这是因为gcc4.7.2的可执行文件还没有加入到搜索命令路径中,
所以我们要手动加入。
3.1 添加新版gcc的可执行文件到命令搜索路径中
1 $ which gcc (首先用which命令查看使用gcc时,系统调用的是哪个路径下的gcc) 2 $ /usr/bin/gcc (我的显示是这样,说明gcc命令调用的是这个路径下的gcc)
为此,我们要使用ln命令,建立一个链接,让 /usr/bin/gcc 指向我们安装目录下的gcc. 因为我之前的/usr/bin/gcc已经指向了gcc4.4。
1 $ sudo rm /usr/bin/gcc (删除这个链接) 2 $ sudo ln -s /usr/local/gcc-4.7.2/bin/gcc /usr/bin/gcc (gcc使用软链接到gcc4.7.2) 3 $ gcc --version (查看下gcc的版本看看有没有成功!)
显示如下,表示成功了:
$ gcc (GCC) 4.7.2 Copyright © 2012 Free Software Foundation, Inc. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保; 包括没有适销性和某一专用目的下的适用性担保。
3.2 用同样的方法重新链接下g++,就能使用g++4.7.2了!
1 $ which g++ 2 $ /usr/bin/g++ 3 $ sudo rm /usr/bin/g++ 4 $ sudo ln -s /usr/loca/gcc-4.7.2/bin/g++ /usr/bin/g++ 5 $ g++ -version
显示如下,表示成功了:
$ g++ (GCC) 4.7.2 Copyright © 2012 Free Software Foundation, Inc. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保; 包括没有适销性和某一专用目的下的适用性担保。
四、最后,随便编写一个小程序,使用gcc来测试一下吧!