在mac上安装GNU GCC

fel*_*hew 9 macos gcc clang

我最近对Xcode 5中包含的新的clang编译器感到沮丧.我想知道在OS X上安装GNU GCC的最佳方法是什么.

需要考虑的事项:

  • 我不想使用MacPorts,fink,自制软件或任何其他第三方软件包管理器.
  • 如果可能的话,我想使用从源代码编译的最新GCC.
  • 我需要现有的GCC(硬链接到clang)作为默认值,但是在我需要时可以轻松地使用GNU GCC.
  • 如果可能的话,我想避免修改代码.

编辑:成功!使用GCC 4.9.2(使用GMP 5.1.3,MPFR 3.1.2,MPC 1.0.2,ISL 0.12.2和CLooG 0.18.1),我成功构建了GCC.从这里获取的提示:

  • 确保使用ISL和CLooG.是的,它们是可选的,但它们是一个更优化的编译器,我在没有它们的情况下构建很困难.确保使用ISL 0.12,而不是最新版本(0.14).
  • 如果可能,请使用独立的开发人员工具,而不是 XCode.(XCode有一些错误的标题,虽然我没有注意到构建GCC的任何问题,但我遇到了其他软件(例如GPG)的问题).
  • 我建议将所有源代码放在gcc目录中,而不是单独构建和安装(这种方式更快)
  • 确保你调用configure,CC=clang CXX=clang++所以GCC知道它不是由GCC编译的.
  • 绝对,绝对,绝对,调用make-j8,或以其他方式构建需要大约4个小时!(-j8我的2012年中期MBP使用8GB RAM需要1 1/3小时.)(make -j8意味着make可以同时构建8个线程(4个核心+ HT),而在2核心机器上运行make -j4.)

希望这可以帮助!

Com*_*Eel 8

Homebrew 现在有 GCC 包,因此您可以使用以下命令安装它:

brew install gcc
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但问题的关键是编译 GCC *而无需 * 外部工具或包管理器。(否则我会使用 MacPorts。) (3认同)

Jon*_*ler 6

我这样做的方式是:

  1. 下载GCC的源代码和众多支持包.这些说明在gcc-4.x.y/INSTALL/index.htmlGCC源代码的文件中,或在http://gcc.gnu.org/install/上在线.

  2. 使用脚本将GCC和支持库的源提取到目录中,创建对象目录,然后运行构建.

这是我用于GCC 4.8.2的脚本:

GCC_VER=gcc-4.8.2
tar -xf ${GCC_VER}.tar.bz2 || exit 1

(
cd ${GCC_VER} || exit

cat <<EOF |
    cloog 0.18.0 tar.gz 
    gmp 5.1.3 tar.xz 
    isl 0.11.1 tar.bz2 
    mpc 1.0.1 tar.gz 
    mpfr 3.1.2 tar.xz
EOF

while read file vrsn extn
do
    (
    set -x
    tar -xf "../$file-$vrsn.$extn" &&
    ln -s "$file-$vrsn" "$file"
    )
done
)

mkdir ${GCC_VER}-obj
cd ${GCC_VER}-obj
../${GCC_VER}/configure --prefix=$HOME/gcc/gcc-4.8.2
make -j8 bootstrap
Run Code Online (Sandbox Code Playgroud)

完成后,也运行安装.然后$HOME/gcc/gcc-4.8.2/bin在您的PATH之前添加(您在--prefixplus中指定的名称/bin)/usr/bin.

使用具有5400 rpm旋转磁盘的MacBook Pro,编译所有内容(使用-j8选项make)需要一到两个小时,并且在编译时需要几千兆字节的磁盘空间.SSD这样做很好(绝对更快)!


GCC 4.9.0于2014-04-22发布.我使用基本相同的过程安装它,但使用CLooG 0.18.1和ISL 0.12.2(必需更新)和GMP 5.1.3(和6.0.0a),MPC 1.0.2(或1.0.1)和MPFR 3.1.2在Mac OS X 10.9.2 Mavericks和Ubuntu 12.04衍生产品上.请注意gmp-6.0.0a.tar.xz提取到目录中gmp-6.0.0(不像gmp-6.0.0a您期望的那样).


2014年至2017年3月27日期间,我建立了GCC版本4.9.0,4.9.1,5.1.0,5.2.0,5.3.0,6.1.0,6.2.0,6.3.0,7.1.0对于macOS Sierra上的GCC 7.2.0,下面显示的构建脚本只有很小的变化(10.12).辅助库的版本经常变化.


macOS Sierra和High Sierra

在2017-08-14,我使用上面脚本的一个小变体在macOS Sierra 10.12上构建GCC 7.2.0(使用XCode 8作为引导程序编译器).一个变化是似乎不再需要CLooG(我停止使用GCC 6.2.0添加它).这是我目前的脚本:

#!/bin/bash

#export DYLD_LIBRARY_PATH=$(clnpath $(dirname $(dirname $(which g++)))/lib:$DYLD_LIBRARY_PATH)
unset DYLD_LIBRARY_PATH

TAR=/opt/gnu/bin/tar
VER_NUM=7.2.0
GCC_VER=gcc-${VER_NUM}
TGT_BASE=/opt/gcc
TGT_DIR=${TGT_BASE}/v${VER_NUM}
CC=/usr/bin/clang
CXX=/usr/bin/clang++

extract() {
    echo "Extract $1"
    $TAR -xf $1
}

if [ ! -d "$GCC_VER" ]
then extract ${GCC_VER}.tar.xz || exit 1
fi

(
cd ${GCC_VER} || exit

nbncl <<EOF |
    gmp     6.1.2   tar.lz 
    isl     0.16.1  tar.bz2 
    mpc     1.0.3   tar.gz 
    mpfr    3.1.5   tar.xz
EOF

while read file vrsn extn
do
    tarfile="../$file-$vrsn.$extn"
    if [ ! -f "$tarfile" ]
    then echo "Cannot find $tarfile" >&2; exit 1;
    fi
    if [ ! -d "$file-$vrsn" ]
    then
        (
        set -x
        extract "$tarfile" &&
        ln -s "$file-$vrsn" "$file"
        ) || exit 1
    fi
done
)

if [ $? = 0 ]
then
    mkdir ${GCC_VER}-obj
    cd ${GCC_VER}-obj
    ../${GCC_VER}/configure --prefix="${TGT_DIR}" \
        CC="${CC}" \
        CXX="${CXX}"
    make -j8 bootstrap
fi
Run Code Online (Sandbox Code Playgroud)

确保你的版本tar支持所有4种不同的压缩文件格式(.lz,.gz,.xz,.bz2),但由于标准Mac版tar确实对我来说,它可能会为你工作了.

在2017-09-27,我无法使用与Sierra 10.12相同的脚本在macOS High Sierra 10.13(使用XCode 9作为引导编译器)上构建GCC 7.2.0.即时错误是缺少标题<stack>; 我需要追踪我的XCode 9安装是否正确 - 或者更准确地说,为什么它不正确,因为它是C++ 98以后<stack>标准头.可能很容易解决; 我还没花时间追逐它.(是的,我已经xcode-select --install多次运行;由于网络故障我不得不多次运行它可能是麻烦的一部分.)