如何确保我的默认 C/C++ 编译器是 GCC

How do I make sure that my default C/C++ compiler is GCC

我正在尝试在 macOS (https://docs.riak.com/riak/kv/2.2.3/setup/installing/mac-osx.1.html#installing-from-source) 上从源代码安装 Riak。

有注释:

Riak will not compile with Clang. Please make sure that your default C/C++ compiler is GCC

如何找出默认编译器以及如何更改它?

macOS Catalina (10.15.4),which 命令打印:

$ which clang
/usr/bin/clang
$ which gcc
/usr/bin/gcc

在 macOS Catalina(以及之前的版本,很可能还有后续版本)上,问题有两个方面和一些建议的解决方案。

make 默认使用的编译器名称是什么?

$ mkdir junk
$ cd junk
$ > x.cpp
$ > y.c
$ make x y
c++     x.cpp   -o x
cc     y.c   -o y
$ cd ..
$ rm -fr junk

这表明make使用的名字是ccc++。那些显然不是 clangclang++,但它们显然也不是 gccg++

$ which cc c++
/usr/bin/cc
/usr/bin/c++
$

它到底是哪个编译器?

ccc++gccg++clangclang++ 名称背后的真正编译器是什么?我们可以通过让它们识别它们的版本来检查它们到底是哪个编译器:

$ for compiler in cc c++ gcc g++ clang clang++
> do
>     which $compiler
>     $compiler --version
> done
/usr/bin/cc
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
/usr/bin/c++
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
/usr/bin/gcc
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
/usr/bin/g++
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
/usr/bin/clang
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
/usr/bin/clang++
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$

可以看到,/usr/bin中安装的版本都是同一个编译器,那个编译器是clangclang++

这是 运行 在装有 macOS Mojave 10.14.6 和 XCode 11.3.1 的机器上。 XCode 的最新版本 — 11.4.1 — 仅在 Catalina 上可用。然而,一般的结论是相同的——所有的 C 和 C++ 编译器实际上都是 clangclang++ 的伪装。

如何将 GNU GCC 安装到您的机器上?

如何将真正的 GNU GCC — 真正的 GCC,而不是 clang 伪装的 — 安装到您的机器上?

  • 使用 Brew 安装 GCC(我没有检查当前的 GCC 版本)。
  • 或使用 MacPorts(同样,我没有检查当前的 GCC 版本)。
  • 如果您喜欢冒险,请自己动手(但我尚未成功在 Catalina 上构建 GCC 9.3.0;我有一个在 macOS Mojave 10 上构建的 GCC 9.2.0。14.x不过在 Catalina 上工作正常——需要一个环境变量来定位 headers).
  • 也许 Fink — 它列出了 2020 年可用的 GCC 8.4;我不知道更新的版本。

请注意,Apple 已将系统 header 文件隐藏在数英里以外的地方(不在 /usr/include — 而且您无法修改文件系统的那部分以添加符号链接到他们隐藏它们的地方):

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

(你是说你猜不到?我也猜不到!)

如何更改默认编译器?

一旦你在合适的地方安装了 GCC,你需要确保你使用 'real' GCC 而不是 /usr/bin 中的 'fake'。您可以通过确保 'real' GCC 的 bin 目录出现在 /usr/bin 之前的 PATH 中来部分做到这一点。我在 /opt/gcc/v9.3.0 下安装了 GCC 9.3.0,所以 /opt/gcc/v9.3.0/bin/usr/bin 之前很久就出现在我的 PATH 中。

您还需要确保 riak(您正在安装的软件)的配置使用正确的编译器。如果有 ./configure 脚本,运行 它具有为编译器指定的正确路径。例如,我可能会使用:

./configure CC=/opt/gcc/v9.3.0/bin/gcc CXX=/opt/gcc/v9.3.0/bin/g++

您也可以将这些值设置为环境变量。

如果它使用 cmake 或其他一些配置包,您需要查阅安装说明。这通常是 README 或有时是 INSTALL.


另请参阅(越来越旧的帖子):