Mac clang安装似乎覆盖了GCC安装



Mac 10.13.6 High Sierra。C开发新手,我正在尝试用最新的稳定/推荐的GCC版本进行设置,我相信(老实说)是10.2。

当我去终端查看我安装了什么:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ gcc -dumpversion
4.2.1

好的。。。在输出中看到LLVM/crang相关的内容,我感到很惊讶。所以我试试这个:

$ clang --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

因此,几乎就好像……我安装了clanggcc,但我的clang安装吸收了我的GCC安装?!否则为什么gcc --version输出引用会叮当作响?

这是典型的Mac设置吗?

我需要做些什么才能在我的机器上正确安装GCC 10.2

以下是一些简单的事实、陈述和观察,试图解释正在发生的事情:

  • Apple附带macOSclang/LLVM编译器。CCD_ 6是";前端">可以将CC++Objective-C解析为LLVM(称为"后端">)可以编译

  • Clang/LLVM位于/Applications/Xcode.app/somewhere

  • Apple还提供了一个仅运行clang/usr/bin/gcc。我不知道他们为什么这么做——这对我来说似乎没有太大帮助——但他们不回答我的问题

  • 苹果将其二进制文件(程序)放在/usr/bin中。这是macOS不可或缺的一部分,你永远不应该触摸或更改其中的任何东西-如果你这样做,你会问问题。这个警告也适用于Python。


如果您想要真正可爱的GNU编译器集合(GCC),其中包括gccg++gfortran编译器,那么IMHO最好是从自制程序中获得它们。我不会把安装说明放在这里,因为它们可能会过时,所以你应该使用自制网站上的安装说明。

一旦安装了自制程序,就可以安装GNU编译器集合(GCC)

brew install gcc

之后,您将在/usr/local/bin中拥有所有可爱的GNU编译器集合(GCC)工具,因此您应该将其放在PATH中,靠近开头,并且在任何情况下都在/usr/bin之前,使用:

export PATH=/usr/local/bin:$PATH

一般来说,您还应该在登录配置文件或系统登录配置文件中添加一行类似的行,以便在每次您或任何其他用户登录时都进行设置。

让我们看看:

ls /usr/local/bin/gcc* /usr/local/bin/g++*
/usr/local/bin/gcc-10
/usr/local/bin/g++-10

根据版本和更新,您将有以下程序可用:

gcc-10          # the real GNU C compiler
g++-10          # the real GNU C++compiler
gfortran        # GNU fortran compiler

你可以用检查他们的版本

gcc-10 -v
g++-10 -v
gfortran -v

现在您了解了自制软件,下面是一些更简单的事实和观察结果:

  • 为您提供二进制文件(程序)的人员(不是操作系统的供应商)应该将他们的东西放在/usr/local中,以表明这只是本地安装的程序,而不是macOS操作系统的核心部分

  • 自制程序表现良好,将其二进制文件(程序)安装在/usr/local/Cellar中,然后通常从/usr/local/bin/PROGRAM到Cellar进行符号链接。这些都不会干扰苹果提供的东西。

  • 如果您想运行自制版本的命令,您应该首先在PATH 上安装/usr/local/bin

让我们看看那些符号链接:

ls -l /usr/local/bin/g*10
lrwxr-xr-x  1 mark  admin  31 21 Aug 16:41 /usr/local/bin/g++-10 -> ../Cellar/gcc/10.2.0/bin/g++-10
lrwxr-xr-x  1 mark  admin  31 21 Aug 16:41 /usr/local/bin/gcc-10 -> ../Cellar/gcc/10.2.0/bin/gcc-10

如果您想知道在输入命令时实际运行的是什么,请像这样使用type命令。

type gcc
gcc is hashed (/usr/bin/gcc)

这告诉你,如果你运行gcc,你实际上会运行/usr/bin/gcc,我们知道它来自Apple,因为它在/usr/bin


现在试试这个:

type gcc-10
gcc-10 is hashed (/usr/local/bin/gcc-10)

这告诉你,如果你运行gcc-10,你实际上会运行/usr/local/bin/gcc-10,我们知道它来自自制程序,因为它在/usr/local/bin

我只是通过将这些添加到~/.zshrc中来解决这个问题(因为我使用的是zshrc):

alias gcc="gcc-12"
alias g++="g++-12"
alias cc="cc-12"
alias c++="c++-12"

在我使用自制软件安装gcc-12的基础上:

brew install gcc-12

这就是我跑步的目的;gcc——版本";使用别名后:

% gcc --version 
gcc-12 (Homebrew GCC 12.2.0) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

此外,您可以使用vi:在zshrc中进行编辑

cd
vi ~/.zshrc

我已经通过设置到GCC的符号链接解决了这个问题:

ln -s /usr/local/bin/g++-${VERSION} /usr/local/bin/g++
ln -s /usr/local/bin/gcc-${VERSION} /usr/local/bin/gcc

GCC安装不应该提供这些链接(GCC可能有很多不同的版本,所以应该链接哪个?),但正如Mark Setchell所写,/usr/bin/gcc是存在的。所以,如果你向系统请求GCC,它会运行这个。

如果/usr/local/bin/usr/bin/gcc之前,则在添加这些链接并检查PATH之后,一切都应该正常。

它甚至在GitHub Actions MacOS工作中也对我有效。

最新更新