在 Mac 上安装 GNU GCC

13
最近我对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和CLooG。是的,它们是可选的,但它们可以制作一个更优化的编译器,如果没有它们,我就无法构建。确保您使用ISL 0.12,而不是最新版本(0.14)。 - 如果可能,请使用独立的开发人员工具,而不是XCode。(XCode有一些错误的头文件,尽管我在构建GCC时没有注意到任何问题,但我在其他软件(例如GPG)中遇到了问题。) - 我建议将所有源放在gcc目录中,而不是分别构建和安装它们(这样速度更快)。 - 确认一定要使用“configure”命令,并使用“CC=clang CXX=clang++”参数,以便GCC知道它并不是由GCC编译的。 - 一定要使用“make -j8”命令,否则会花费大约4个小时才能完成构建!(使用“-j8”,在我的Mid-2012 MBP上需要1 1/3小时,配备了8GB RAM,因为“make -j8”可以同时构建8个线程(4个核心+ HT),而在双核机器上,您需要运行“make -j4”。)
希望这有所帮助!

3
你已经排除了简单的解决方案,如MacPorts的 port -b install gcc48 -universal; port select --set gcc mp-gcc48,并且想从源代码进行编译,但是这并没有起作用,并且你也没有提供错误日志或失败的配置选项。你是否意识到构建工具链可能会出现多少问题?你需要更加具体地说明你遇到的错误。 - Brett Hale
@BrettHale 这个有帮助吗:https://gist.github.com/felixphew/d024c8ea88ed9c2ffd52?另外,阅读编辑后的问题以了解完整情况。 - felixphew
这14k+行日志中没有错误。但它似乎还没有完成。这是你所拥有的全部内容,还是日志被截断了? - n. m.
@BrettHale 是的,抱歉,那个日志被截断为1mb了,这里是完整的日志 - felixphew
1
看起来和这里的问题一样。无论如何,我建议先从端口安装,然后如果需要的话,使用端口gcc作为引导编译器从源代码安装。 - n. m.
@n.m. 谢谢!作为最后的手段,我可能会尝试一下。 - felixphew
4个回答

10

现在,Homebrew有GCC软件包,您可以使用以下命令安装:

brew install gcc

brew install gcc

4
感谢您的回答,不过这个问题的重点是在没有使用外部工具或软件包管理器的情况下编译GCC(否则我会使用MacPorts)。请帮忙翻译。 - felixphew
1
既然这个问题在谷歌搜索中排名第一,有答案在这里是很好的。 - uucp
为了让您的文件选择正确的gcc,不要使用Xcode的Clang的gcc,否则它会不断要求安装“命令行开发工具”。只需为您的文件创建符号链接以找到适当的gcc。例如,sudo ln -sf /opt/homebrew/bin/gcc-13 /usr/local/bin/x86_64-linux-gnu-gcc 或者 sudo ln -sf /opt/homebrew/bin/gcc-13 /usr/local/bin/aarch64-linux-gnu-gcc,具体情况而定。 - undefined

6
我做的方式是:
  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)添加到您的PATH路径之前,位于/usr/bin之前。
使用一个速度为5400 rpm的良好MacBook Pro,在编译全部内容时需要一两个小时(使用-j8选项进行make),并且在编译过程中需要多个千兆字节的磁盘空间。在这种情况下,SSD很好用(肯定更快)!

GCC 4.9.0发布于2014年4月22日。我使用基本相同的过程安装了它,但需要更新CLooG 0.18.1和ISL 0.12.2,并在Mac OS X 10.9.2 Mavericks和Ubuntu 12.04派生版上安装了GMP 5.1.3(和6.0.0a)、MPC 1.0.2(或1.0.1)和MPFR 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作为引导编译器)。有一个变化是似乎不再需要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

确保您的tar版本支持所有4种不同的压缩文件格式(.lz, .gz, .xz, .bz2),但由于标准的Mac版本tar已经为我完成了这个任务,所以它可能也适用于您。

在2017年9月27日,我尝试构建GCC 7.2.0在macOS High Sierra 10.13上(使用XCode 9作为引导编译器),但与在Sierra 10.12上使用的相同脚本失败了。直接的错误是缺少头文件<stack>;我需要找出我的XCode 9安装是否正确 - 或更准确地说,为什么不正确,因为<stack>是C++98以来的标准头文件。可能有一个简单的解决方案;我只是还没有花时间去追寻它。(是的,我已经多次运行了xcode-select --install;由于网络故障,我不得不多次运行它,这可能是问题的一部分。)(我成功地编译了GCC 7.2.0在2017年12月2日;我不记得需要进行任何体操才能使其工作。)

时间流逝,版本号不断增加。然而,这个基本的方法对于我来说在更近期的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年5月3日)。每个版本都是在当前macOS版本上使用当前的XCode进行引导阶段构建和安装的(因此,在构建GCC 9.1.0时使用macOS 10.14.4 Mojave和XCode 10.2.1)。

你从哪里听说需要ISL和CLooG?我安装了GMP、MPFR和MPC,并告诉./configure在哪里找到它们(更不用说在构建过程中告诉它们彼此的位置了!)。构建大约进行了15分钟左右,然后第一次出现缺少目录的错误,经过make distclean和重试整个过程后,又出现了缺少stdio的错误。 - felixphew
配置过程会查看gcc-4.8.2目录中是否有mpfr目录,以及其中是否包含OK版本的MPFR源代码。如果存在,则使用该代码。如果不存在,则查找是否可以找到可用的预编译代码。所示脚本确保在gcc-4.8.2目录中找到源代码。 - Jonathan Leffler
仅供记录,看起来我在第3阶段停止了10月的构建;当我再次运行'make'以检查是否完成时,它又进行了许多编译。因此,时间(比我记得的快)不仅是40分钟;我估计的“一两个小时”更接近准确。 - Jonathan Leffler
顺便问一下,-j8 是什么意思? - felixphew
-j8 表示最多可同时运行8个进程; 它可以启用并行构建,并显著加快速度。 - Jonathan Leffler
显示剩余4条评论

3

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

gcc-4.9

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

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

下载我的二进制文件,并cd下载文件夹。然后gunzip gcc-4.9-bin.tar.gz(如果您的浏览器没有自动执行),然后sudo tar -xvf gcc-4.9-bin.tar -C /。它会将所有内容安装在/usr/local中。您可以通过简单地键入gfortran来调用Fortran 95编译器。您还需要从Mac App Store安装Apple的XCode工具。使用XCode 4或5,您还需要作为附加步骤下载命令行工具。您会在XCode的首选项中找到下载命令行工具的选项。

在10.9 Mavericks上,您可以通过简单地键入xcode-select --install来获取命令行工具。


这可能是一个解决方案,但我更希望在我的机器上编译一个纯正的GCC,或者可能是GNU官方软件包。虽然这可能是最后的手段,但也很有用。谢谢! - felixphew
@felixphew,不用谢!“a straight GCC”是什么意思?我以前从没听说过。o_O - l'L'l
“直接 GCC” 是指从最新的官方源代码编译而成,没有修改或补丁的版本。 - felixphew
1
@felixphew,也许你没有意识到,但即使是苹果版本的GCC(直到10.9为止)也不是“官方”版本;那是他们自己修改过的版本。而你提到的预编译版本中有哪些修改和/或补丁? - l'L'l
是的,我知道苹果的GCC从来没有官方版本,事实上,这就是为什么在我升级到Mavericks之前,我就尝试在我的电脑上进行编译。然而,当它无法工作时,我只是说“好吧”,将就着用。现在,苹果的编译器与GCC存在一些烦人的不兼容性,我宁愿不去处理它们。 - felixphew

0
Homebrew现在有GCC包,所以你可以用这个命令安装它:
brew install gcc
不要使用Xcode的Clang的gcc,否则它会不断要求安装命令行开发工具。
为了让你的make文件能够找到正确的Homebrew gcc,只需为你的make文件创建符号链接以找到适当的gcc。例如:
sudo ln -sf /opt/homebrew/bin/gcc-13 /usr/local/bin/x86_64-linux-gnu-gcc 或者
sudo ln -sf /opt/homebrew/bin/gcc-13 /usr/local/bin/aarch64-linux-gnu-gcc
根据情况而定。
在Sonoma 14.1.2上成功运行。
如果你使用Homebrew安装了make和cmake,你需要将bin路径添加到PATH变量中。例如,在fish shell中,我们将gnubin路径添加到PATH中:
set -U fish_user_paths /opt/homebrew/opt/make/libexec/gnubin $fish_user_paths

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接