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
因此,几乎就好像……我安装了clang
和gcc
,但我的clang
安装吸收了我的GCC安装?!否则为什么gcc --version
输出引用会叮当作响?
这是典型的Mac设置吗?
我需要做些什么才能在我的机器上正确安装GCC 10.2
以下是一些简单的事实、陈述和观察,试图解释正在发生的事情:
-
Apple附带macOS的
clang/LLVM
编译器。CCD_ 6是";前端">可以将C
、C++
和Objective-C
解析为LLVM
(称为"后端">)可以编译 -
Clang/LLVM
位于/Applications/Xcode.app/somewhere
中 -
Apple还提供了一个仅运行
clang
的/usr/bin/gcc
。我不知道他们为什么这么做——这对我来说似乎没有太大帮助——但他们不回答我的问题 -
苹果将其二进制文件(程序)放在
/usr/bin
中。这是macOS不可或缺的一部分,你永远不应该触摸或更改其中的任何东西-如果你这样做,你会问问题。这个警告也适用于Python。
如果您想要真正可爱的GNU编译器集合(GCC),其中包括gcc
、g++
和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工作中也对我有效。