编译GCC

2013年12月14日

折腾病又犯了,这次我要从源代码编译GCC.在这里小记一下.

  1. GCC会依赖mpc,mpfr和gmp这三个包,所以先从源代码编译好吧.有人说可以直接把这三个包的源代码解压到GCC源代码下(去掉版本号啥的,就mpc这种文件夹名),GCC会自动编译它们,我没有实验.一个更简单的方法是执行gcc目录下的脚本./contrib/download_prerequisites自动下载需要的包。 configure的时候可能需要指定其他包的位置,如

    ./configure –with-gmp=/usr/local/gmp-x.x.x/ # for mpfr ./configure –with-gmp=/usr/local/gmp-x.x.x –with-mpfr=/usr/local/mpfr-x.x.x # for mpc

p.s. 最新版的mpfr好像改变了源代码的位置,放到了mpfr-x.x.x的子目录src下,包含的时候注意。另外编译mpc的时候需要指定LIBRARY的位置,用以下命令导出环境变量:

    export C_INCLUDE_PATH=/path/to/mpfr-x.x.x/src:$C_INCLUDE_PATH
    export LD_LIBRARY_PATH=/path/to/mpfr-x.x.x/src/.libs
    export LIBRARY_PATH=$LD_LIBRARY_PATH
    

p.s. 如果提示`LIBRARY_PATH shouldn't contain the current directory`,那可能是因为LIBRARY_PATH中有两个连续的`:`,删除多余的`:`就行。

p.s. 如果提示`fatal error: gnu/stubs-32.h: No such file or directory`,那可能是因为系统没有安装32位库的头文件,可以安装`libc6-dev-i386(Ubuntu)/glibc-devel.i686(RedHat)`或configure时`--disable-multilib.`禁用32位功能。
  1. 注意GCC的Makefile不支持uninstall,所以,最好把GCC的prefix设置到一个单独的文件夹,那删起来的时候也比较方便.然后

    ./configure –prefix=/path/to/gcc –with-gmp=/usr/local/gmp-x.x.x –with-mpfr=/usr/local/mpfr-x.x.x make make install

p.s.编译过程中出现错误`gcc-v4.6.1/gcc/system.h:462:20: error: conflicting types for ‘strsignal’`时([邮件列表][1]),需要清空这两个环境变量:

    export CPLUS_INCLUDE_PATH=
    export C_INCLUDE_PATH=
    

p.s.出现错误找不到`mpfr.h`或`mpc.h`时,设置环境变量包含这两个文件位置

    export CPLUS_INCLUDE_PATH=/path/to/mpfr-x.x.x/src:/path/to/mpc-x.x.x/src
    export C_INCLUDE_PATH=/path/to/mpfr-x.x.x/src:/path/to/mpc-x.x.x/src
    

出现错误时一般都是由于`LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE`这几个环境变量引起的。
  1. 编译完成后安装记得修改PATH变量和LIB位置

    export PATH=/path/to/gcc/bin/:$PATH export LD_LIBRARY_PATH=/path/to/gcc/lib:$LD_LIBRARY_PATH