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

Nik*_*kiy 8 c++ macos gcc clang riak

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

有一个注释:

Riak 不会使用 Clang 进行编译。请确保您的默认 C/C++ 编译器是 GCC

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

macOS Catalina (10.15.4),命令打印:

$ which clang
/usr/bin/clang
$ which gcc
/usr/bin/gcc
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 12

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

\n\n

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

\n\n
$ mkdir junk\n$ cd junk\n$ > x.cpp\n$ > y.c\n$ make x y\nc++     x.cpp   -o x\ncc     y.c   -o y\n$ cd ..\n$ rm -fr junk\n
Run Code Online (Sandbox Code Playgroud)\n\n

这表明 所使用的名称makeccc++。这些不是明显的clangclang++,但它们也不是明显的gccg++

\n\n
$ which cc c++\n/usr/bin/cc\n/usr/bin/c++\n$\n
Run Code Online (Sandbox Code Playgroud)\n\n

它到底是哪个编译器?

\n\n

cc哪个编译器真正存在于、c++gccg++clang和的名字后面clang++?我们可以通过让它们识别其版本来检查它们到底是哪个编译器:

\n\n
$ for compiler in cc c++ gcc g++ clang clang++\n> do\n>     which $compiler\n>     $compiler --version\n> done\n/usr/bin/cc\nApple clang version 11.0.0 (clang-1100.0.33.17)\nTarget: x86_64-apple-darwin18.7.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin\n/usr/bin/c++\nApple clang version 11.0.0 (clang-1100.0.33.17)\nTarget: x86_64-apple-darwin18.7.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin\n/usr/bin/gcc\nConfigured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1\nApple clang version 11.0.0 (clang-1100.0.33.17)\nTarget: x86_64-apple-darwin18.7.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin\n/usr/bin/g++\nConfigured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1\nApple clang version 11.0.0 (clang-1100.0.33.17)\nTarget: x86_64-apple-darwin18.7.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin\n/usr/bin/clang\nApple clang version 11.0.0 (clang-1100.0.33.17)\nTarget: x86_64-apple-darwin18.7.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin\n/usr/bin/clang++\nApple clang version 11.0.0 (clang-1100.0.33.17)\nTarget: x86_64-apple-darwin18.7.0\nThread model: posix\nInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin\n$\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,安装的版本/usr/bin都是相同的编译器,并且该编译器是clangclang++

\n\n

这是在装有 macOS Mojave 10.14.6 和 XCode 11.3.1 的计算机上运行的。最新版本的 XCode \xe2\x80\x94\xc2\xa011.4.1 \xe2\x80\x94 仅在 Catalina 上可用。然而,一般的结论是相同的 \xe2\x80\x94 所有的 C 和 C++ 编译器都是真的clang并且clang++伪装的。

\n\n

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

\n\n

如何获得真正的 GNU GCC \xe2\x80\x94 真正的 GCC,而不是clang伪装的 \xe2\x80\x94 放到你的机器上?

\n\n
    \n
  • 使用酿造安装 GCC(我没有检查当前是哪个版本的 GCC)。
  • \n
  • 或者使用MacPorts(同样,我没有检查当前的 GCC 版本)。
  • \n
  • 如果您喜欢冒险,请自己动手(但我尚未在 Catalina 上成功构建 GCC 9.3.0;我在 macOS Mojave 10.14.x 上构建了 GCC 9.2.0,尽管 \xe2 在 Catalina 上运行正常\x80\x94 以及定位标头所需的一个环境变量)。
  • \n
  • 也许是芬克 \xe2\x80\x94 会将 GCC 8.4 列为 2020 年可用;我不知道新版本。
  • \n
\n\n

请注意,Apple 已将系统头文件隐藏在很远的地方(不是在/usr/include\xe2\x80\x94 中,并且您无法修改文件系统的该部分以将符号链接添加到它们隐藏的位置)他们):

\n\n
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include\n
Run Code Online (Sandbox Code Playgroud)\n\n

(你的意思是你猜不到?我也猜不到!)

\n\n

如何更改默认编译器?

\n\n

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

\n\n

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

\n\n
./configure CC=/opt/gcc/v9.3.0/bin/gcc CXX=/opt/gcc/v9.3.0/bin/g++\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
\n\n

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

\n\n\n