本文的目标是安装2010年发布的GCC 4.4.5版本,这是因为很多OJ平台还是沿用这个老版本,方便线下测试代码。

GCC 4.8.1是第一个完整包含2011 C++标准的版本,编译时候通过-std=c++11来设置flag支持C++ 11标准。

linux

linux下编译安装可以灵活配置,具体可以参考GNU主页上的教程。如果想要快速安装直接参考这篇官方wiki

编译技巧:

  • 通过make -j x来设置多线程编译提升速度,不然巨慢!
  • 为了方便编译错误后重新编译,不在gcc源码下编译,在外面新建一个文件夹,进入这个新建的文件夹编译: ../gcc-4.4.5/configure --prefix=$HOME/GCC-4.4.5 --enable-languages=c,c++,fortran

依赖问题:

  • 编译报错很有可能是未解决的prerequire依赖。已知必须解决的依赖包括
    • The GNU Multiple Precision Arithmetic Library(GMP)
    • The GNU MPFR Library(MPFR)
    • MPC Library(MPC)
  • 已知gcc 4.6.2或较高版本gcc源码分发包含./contrib/download_prerequisites工具用于在编译前下载依赖。以GMP为例,通过该工具在gcc源码下产生gmp文件夹,在编译gcc时候便可以动态链接gmp里面的源文件和头文件。实际上download_prerequisites就是一个sh脚本,下载并链接三个重要的依赖库,其内容粘贴如下:
      #! /bin/sh
    
      # Download some prerequisites needed by gcc.
      # Run this from the top level of the gcc source tree and the gcc
      # build will do the right thing.
      #
      # (C) 2010 Free Software Foundation
      #
      # This program is free software: you can redistribute it and/or modify
      # it under the terms of the GNU General Public License as published by
      # the Free Software Foundation, either version 3 of the License, or
      # (at your option) any later version.
      # 
      # This program is distributed in the hope that it will be useful, but
      # WITHOUT ANY WARRANTY; without even the implied warranty of
      # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
      # General Public License for more details.
      # 
      # You should have received a copy of the GNU General Public License
      # along with this program. If not, see http://www.gnu.org/licenses/.
    
      MPFR=mpfr-2.4.2
      GMP=gmp-4.3.2
      MPC=mpc-0.8.1
    
      wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPFR.tar.bz2 || exit 1
      tar xjf $MPFR.tar.bz2 || exit 1
      ln -sf $MPFR mpfr || exit 1
    
      wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$GMP.tar.bz2 || exit 1
      tar xjf $GMP.tar.bz2  || exit 1
      ln -sf $GMP gmp || exit 1
    
      wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPC.tar.gz || exit 1
      tar xzf $MPC.tar.gz || exit 1
      ln -sf $MPC mpc || exit 1
    
      rm $MPFR.tar.bz2 $GMP.tar.bz2 $MPC.tar.gz || exit 1
    
    
  • 对于gcc 4.4.5,虽然没有download_prerequisites脚本,但是可以把4.6.2的对应文件拷过来运行,如果连接ftp://gcc.gnu.org/太慢的话可以依据脚本自行下载(推荐IDM)对应的依赖库版本。切记in-tree build只接受download_prerequisites脚本安装的依赖库版本。

Windows

Windows下Cygwin等平台提供了binary,可以直接安装,但是不方便灵活选择版本,比如我想要gcc 4.4.5,但是在Cygwin下找不到。

Windows 10 WSL Ubuntu 20.04

Windows10下另一个好的替代方案是在WSL下载安装,不管是哪个linux发行版,通过编译安装即可,可以灵活选择自己的版本。

我的WSL是Ubuntu 20.04发行版,预装gcc是9.3。0,尝试手动编译gcc 4.4.5未能成功。

编译问题:

  • gcc 4.4 由于fgnu89-inline option导致的编译错误在这里有报告,这个问题只针对linux和osx——详情。解决了这个问题又 出现其他问题,暂时没有解决。

黔驴技穷,对于Ubuntu,可以尝试apt软件源安装。

Ubuntu

Ubuntu的apt软件源提供了低版本的gcc,需要手动添加对应的apt仓库后安装

sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu/ trusty main'
sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu/ trusty universe'
sudo apt install gcc-4.4

这种方式安装的gcc版本是4.4.7,勉强算是解决问题,而且方便快捷。

jadymayor@jadymayor-station:/mnt/c/Windows/System32$ gcc-4.4 -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.7-8ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --disable-libmudflap --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.7 (Ubuntu/Linaro 4.4.7-8ubuntu1)

MacOS

较新的Mac Xcode下默认有gcc,但实际上是clang。

如果想要安装真的gcc,可以通过homebrew安装编译好的二进制包。homebrew官网上查询显示支持catalina的最低gcc版本是6.5,所以想要灵活安装低版本gcc也存在问题,比如4.4.5。

MacPorts也是一个不错的选择,但是catalina下安装较低版本也存在困难。

准备尝试在Mac下自己编译安装gcc44版本,然后回来填坑。