linux下编译安装gcc

    最近研究网络编程,最后发现还是unix/linux下相关资源比较多,研究起来方便,所以最近在安装相关开发环境,第一步当然是安装gcc。用rpm包安装,我想很多人会,没什么好说的。这里介绍从源代码编译安装,我的安装平台为fedora11-x86_64。

    首先当然是下载相关源代码了。我下载了gmp-4.3.2.tar.bz2,mpfr-2.4.2.tar.bz2,gcc-4.4.3.tar.bz2这三个包。gcc大家都认识,gmp,mpfr这两个是gcc依赖的,官方描述为。

    GMP is a free library for arbitrary precision arithmetic, operating on signed integers,rational numbers, and floating point numbers。

    The MPFR library is a C library for multiple-precision floating-point computations with correct rounding。

    这三个包中,先安装gmp,再安装mpfr,再安装gcc。不知道有没有人会疑惑,这里要编译这么多源代码,其中包括gcc这个编译器工具,那在编译安装gcc前用什么来编译这些源代码呢?我用的还是gcc。。。这里就是编译原理中的自举(bootstrap)概念了,就是用低级编译器编译高级编译器。我用的是gcc-4.4.0编译安装gcc-4.4.3。事实上,在编译gcc时,默认情况下会编译三次(3 stage),即完成第一次编译后生成stage1编译器,然后用stage1编译器再次编译生成stage2编译器,第三次用stage2编译器编译生成stage3编译器,最后比较stage2编译器和stage3编译器是否一样,来判断编译结果是否正确。

    linux下编译安装主要包括两个过程configure和make,其实具体的功能我也还没仔细研究,大家去看官方文档吧:(。这里只是介绍个大概。congfiure会根据用户指定的参数生成MakeFile,然后make命令会根据MakeFile编译整个源代码。

    在具体操作前先了解下目录结构。一般情况下需要三个目录,源代码包解压会产生一个源代码目录srcdir,编译过程中用来存放中间文件的目标目录objdir,编译完成后的安装目录installdir。要注意的是objdir不能作为srcdir的子目录,反之亦不行。好了,我们开始操作吧。

    对于gmp,我们先用如下命令将源代码包解压。

    tar -xjvf gmp-4.3.2.tar.bz2

    参数中j指定解压方式(压缩也一样)为bzip2,如果是.gz后缀的压缩包,则用g指定解压方式为gzip。解压后生成源代码目录为gmp_srcdir。

    然后进入gmp的目标目录gmp_objdir。

    $ cd gmp_objdir

    然后用如下命令进行configure。

    $ gmp_srcdir/configure --prefix=gmp_installdir --enable-shared

    --prefix和--enable为configure中两种常用参数,其它还有--disable,--with等,后面会用到。--prefix=gmp_installdir用来将gmp_installdir指定为安装目录,--enable-shared用来生产共享库。

    configure成功后,gmp_objdir下会生产MakeFile。然后用make命令编译。

    $ make

    一般情况下,只要configure指定的参数正确,make过程都会成功。不过还是要验证一下,一般安装包都会提供测试用例,用如下命令测试。

    $ make check

    测试通过后,用如下命令安装。

    $ make install

    这样gmp就被成功安装到gmp_installdir。

    gmp安装成功后,继续安装mpfr,不过mpfr依赖gmp,所以configure会需要--with参数,命令如下。

    mpfr_srcdir/configure --prefix=mpfr_installdir --with-gmp=gmp_installdir --enable-shared

    参数中--with-gmp=gmp_installdir用来指定mpfr安装过程中所需的gmp包的安装目录。剩下的步骤跟gmp一样,就不赘述了。

    最后安装gcc,用如下命令进行configure。

    gcc_srcdir/configure --prefix=gcc_install --enable-threads=posix --enable-shared --disable-multilib --disable-checking --enable-languages=c,c++,java --with-gmp=gmp_installdir --with-mpfr=mpfr_installdir

    参数中--enable-threads=posix指定 POSIX/Unix98作为线程支持库,这个很重要。--disable-checking用来关闭一些内部检查以减少编译时间。事实上,就像前面介绍的,你也可以加上--disable-bootstrap参数来取消3-stage编译,这样可以节省很多时间,不过为了编译正确,不推荐这样做。参数--enable-languages=c,c++,java用来指定编译器支持的语言。对于我使用的fedora-x86_64,最好加上--disable-multilib参数,不然你可能遇到gnu/stubs-32.h: No such file or directory错误。这个参数是用来取消多目标库编译的,即取消32位库编译,因为我的linux没有编译32位库需要的文件。。。

    同样,configure正确后,进行make编译,最后进行make install安装。不同的平台,不同的参数会引起不同的问题,遇到问题最好的解决办法当然是查看官方说明。。。最后祝大家安装顺利:)。


Update in 1月3号 2015

1) 编译gcc前需安装build-essential, bison, flex。

2) 编译gmp, mpfr后,如果其被安装在非默认lib目录,需要设置LD_LIBRARY_PATH至相应lib目录路径

3) 编译gcc-4.4.7需要ppl, clong-ppl,编译ppl需要在编译gmp时,增加--enable-cxx选项

4) 编译gcc前需设置C_INCLUDE_PATH和CPLUS_INCLUDE_PATH,指向/usr/include/x86_64-linux-gnu/。设置LIBRARY_PATH,指向/usr/lib/x86_64-linux-gnu/。否则,可能出现找不到predefs.h,或crtio1.o文件的错误


你可能感兴趣的:(Unix/Linux)