【问题标题】:Install GNU GCC on mac在 mac 上安装 GNU GCC
【发布时间】:2014-02-06 01:15:50
【问题描述】:

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

需要考虑的事项:

  • 我不想使用 MacPorts、fink、homebrew 或任何其他第三方包管理器。
  • 如果可能,我想使用从源代码编译的最新 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 和 CLoG。是的,它们是可选的,但它们会生成更优化的编译器,没有它们我很难构建。确保您使用的是 ISL 0.12,不是最新版本 (0.14)。
  • 如果可能,请使用独立的开发者工具,不是 XCode。 (XCode 有一些错误的标头,虽然我没有注意到构建 GCC 的任何问题,但我在使用其他软件(例如 GPG)时遇到了问题。
  • 我建议将所有源代码放在 gcc 目录中,而不是单独构建和安装(这样更快)
  • 确保您使用CC=clang CXX=clang++ 调用configure,以便GCC 知道它没有被GCC 编译。
  • 一定,一定,一定,使用-j8 调用make,否则构建将需要大约4 个小时! (使用-j8,在我的 2012 年中期 MBP 上使用 8GB RAM 需要 1 1/3 小时。)(make -j8 表示 make 可以同时构建 8 个线程(4 核 + HT),而在 2 核上机器你会运行make -j4。)

希望这会有所帮助!

【问题讨论】:

  • 您已经消除了简单的解决方案 - 例如MacPorts:port -b install gcc48 -universal; port select --set gcc mp-gcc48 - 你想从源代码编译,但这不起作用,你没有提供错误日志失败的配置选项。您是否意识到构建工具链可能会出错?您需要更具体地了解您遇到的错误。
  • @BrettHale 这有什么帮助:gist.github.com/felixphew/d024c8ea88ed9c2ffd52 吗?另外,请阅读完整故事的编辑问题
  • 这 14k+ 行日志中没有错误。不过,它似乎还没有完成。这就是你所拥有的,还是日志被截断了?
  • @BrettHale 是的,抱歉,该日志被截断为 1mb,here is the full log
  • 看起来与here 的问题相同。无论如何,我建议从端口安装,然后然后,如果需要,请使用端口 gcc 之一作为引导编译器从源代码安装。

标签: macos gcc clang


【解决方案1】:

Homebrew 现在有 GCC 包,所以你可以用这个命令安装它:

brew install gcc

【讨论】:

  • 感谢您的回答,但问题的重点是编译 GCC 外部工具或包管理器。 (否则我会使用 MacPorts。)
  • 很高兴在这里得到答案,因为这个问题首先出现在谷歌搜索上。
【解决方案2】:

我的做法是:

  1. 下载 GCC 的源代码和众多支持包。说明在 GCC 源代码的 gcc-4.x.y/INSTALL/index.html 文件中,或在 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

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

对于一台配备 5400 rpm 旋转磁盘的不错的 MacBook Pro,编译所有内容需要一两个小时(使用 make-j8 选项),并且在编译时需要数 GB 的磁盘空间。这样做时 SSD 很好(肯定更快)!


GCC 4.9.0 于 2014 年 4 月 22 日发布。我使用基本相同的过程安装了它,但使用了 CLooG 0.18.1 和 ISL 0.12.2(需要更新)和 GMP 5.1.3(和 6.0.0a)、MPC 1.0.2(或 1.0.1)和 MPFR Mac OS X 10.9.2 Mavericks 和 Ubuntu 12.04 衍生版本上的 3.1.2。请注意gmp-6.0.0a.tar.xz 提取到目录gmp-6.0.0(不是您可能期望的gmp-6.0.0a)。


在 2014 年和 2017 年 9 月 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 (10.12) 上为 GCC 7.2.0 显示的构建脚本只有微小的变化。辅助库的版本经常变化。


macOS Sierra 和 High Sierra

在 2017 年 8 月 14 日,我使用上述脚本的一个小变体在 macOS Sierra 10.12 上构建 GCC 7.2.0(使用 XCode 8 作为引导编译器)。一个变化是似乎不再需要 CLoG(我停止在 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

确保您的 tar 版本支持所有 4 种不同的压缩文件格式(.lz.gz.xz.bz2),但是因为标准 Mac 版本的 tar 可以为我做到这一点,它可能也适合你。

在 2017 年 9 月 27 日,我未能使用与 Sierra 10.12 上相同的脚本在 macOS High Sierra 10.13(使用 XCode 9 作为引导编译器)上构建 GCC 7.2.0。直接错误是缺少标头&lt;stack&gt;;我需要追踪我的 XCode 9 安装是否正确——或者更准确地说,为什么它不正确,因为 &lt;stack&gt;standard header in C++98 之后的版本。可能有一个简单的解决方法;我只是还没有花时间去追它。 (是的,我已经多次运行xcode-select --install;由于网络故障,我不得不多次运行它的事实可能是问题的一部分。)(我在 2017 年成功编译了 GCC 7.2.0 -12-02;我不记得需要什么体操(如果有的话)才能让它发挥作用。)

时间过去了;版本号增加。但是,基本配方对我来说适用于更新版本的 GCC。我有 7.3.0(2018 年 1 月 2 日安装)、8.1.0(2018 年 5 月 2 日安装)、8.2.0(2018 年 7 月 26 日安装)、8.3.0(2019 年 3 月 1 日安装)和现在 9.1.0(今天安装,2019-05-03)。这些版本中的每一个都是在当时的当前版本的 macOS 上构建和安装的,使用当前版本的 XCode 进行引导阶段(因此在构建 GCC 9.1.0 时使用 macOS 10.14.4 Mojave 和 XCode 10.2.1)

【讨论】:

  • 您从哪里听说它需要 ISL 和 CLoG?我确实安装了 GMP、MPFR 和 MPC,并告诉 ./configure 在哪里可以找到它们(更不用说告诉他们在构建过程中在哪里找到彼此!)。构建顺利进行了 15 分钟左右,然后第一次抱怨缺少目录,在 make distclean 并重试整个过程后抱怨缺少 stdio。
  • ISL 和 ClooG 在链接到的安装页面上明确提及。它们是半可选的。我和他们没有任何问题。至于为什么你的构建失败,我不知道。当我上次在这台机器上构建它时(2013 年 10 月 21 日,大约在 21:35 到 22:13 之间),我没有遇到任何问题。请注意,我明确没有单独安装 GMP、MPFR 或 MPC。我过去曾这样做过,但遇到了问题。我让 GCC 在源代码树中找到正确的版本,然后它会构建和使用这些版本。这就是“今日提示”...不要尝试使用独立安装的先决条件版本。
  • 如果./configure 失败,除非我告诉它在哪里可以找到它们,否则它如何自己构建它们?
  • 配置过程查看是否有,例如,gcc-4.8.2 目录中的目录mpfr,以及是否包含 MPFR 的 OK 版本的源。如果它在那里,它会使用它。如果不是,它会查看是否可以找到可以替代的预构建代码。显示的脚本确保在 gcc-4.8.2 目录中找到源代码。
  • 而且,为了记录,看起来我在第 3 阶段的某个地方停止了 10 月的构建;当我再次运行“make”以检查它是否完整时,它再次启动并再次进行了大量编译。所以,时间(比我记忆中的要快)不仅仅是 40 分钟;我的“一两个小时”估计更接近准确。
【解决方案3】:

使用专门为 OS X 10.9.x Mavericks 预编译的二进制文件:

gcc-4.9

使用来自 GNU 服务器的源代码编译。

这包含 gfortran 的当前版本(4.7 是稳定版本) (免费、开源、GNU Fortran 95 编译器)、gcc(GNU C)和 g++(GNU C++)可以执行自动向量化(即修改代码)的编译器 自动利用 AltiVec/SSE)和其他 复杂的优化,如 OpenMP。有关详细信息,请参阅 this webpage

下载我的二进制文件,然后cd下载文件夹。然后gunzip gcc-4.9-bin.tar.gz (如果您的浏览器还没有这样做)然后 sudo tar -xvf gcc-4.9-bin.tar -C /。它将所有东西安装在 /usr/本地。您只需键入即可调用 Fortran 95 编译器 gfortran。您还需要安装 Apple 的 XCode 工具 来自 Mac App Store。使用 XCode 4 或 5,您需要下载 命令行工具作为附加步骤。你会发现选项 在 XCode 的首选项中下载命令行工具。

在 10.9 Mavericks 上,您只需键入即可获取命令行工具 xcode-select --install

【讨论】:

  • 这可能是一个解决方案,但理想情况下,我想要一个直接的 GCC,在我的机器上编译,或者可能是来自 GNU 的官方包。不过,作为最后的手段,这可能会很方便。谢谢!
  • @felixphew,不客气!究竟什么是“直接 GCC”?以前从没听说过那个。 o_O
  • 我所说的“直接 GCC”是指直接从最新的官方源代码编译而来,没有修改或补丁。
  • @felixphew,也许你没有意识到这一点,但即使是 Apple 版本的 GCC(直到 10.9 都包含在内)也不是“官方”版本;这是他们自己的修改版本。您指的是我链接的预编译版本中的哪些修改和/或补丁?
  • 是的,我知道 Apple GCC 从来都不是官方的,事实上,这就是为什么我甚至在升级到 Mavericks 之前就尝试在我的计算机上执行此操作。但是,当它不起作用时,我只是“哦,好吧”并且凑合了。然而,现在苹果编译器与 GCC 存在一些令人讨厌的不兼容问题,我不想处理这些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2012-05-03
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多