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

6

我会假设make文件足够聪明,如果安装了正确的编译器,它会自动选择。无论如何,为什么不尝试一下看看是否有效呢? - Voo
请查看此链接:https://dev59.com/uWw05IYBdhLWcg3wykvn - executable
这个回答解决了你的问题吗?使用CMake在GCC和Clang/LLVM之间切换 - Adrian Mole
2个回答

11
在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++
$

到底是哪个编译器?

cc, c++, gcc, g++, 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.14.x上构建了一个GCC 9.2.0,在Catalina上可以正常工作,但需要一个环境变量来定位头文件)。
  • 也许可以考虑使用 Fink —— 它将GCC 8.4列为2020年提供的版本;我不知道是否有更新的版本。

请注意,苹果公司已经开始将系统头文件隐藏在很远的地方(不在/usr/include中——你不能修改文件系统的这部分,以添加指向它们所隐藏位置的符号链接):

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

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

如何更改默认编译器?

一旦您在适当的位置安装了GCC,您需要确保使用“真正的”GCC而不是/usr/bin中的“假”的GCC。为此,您需要确保“真正的”GCC的bin目录出现在您的PATH中,而不是/usr/bin。我已经在/opt/gcc/v9.3.0下安装了GCC 9.3.0,因此/opt/gcc/v9.3.0/bin出现在我的PATH上,远在/usr/bin之前。

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

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

你还可以将这些值设置为环境变量。
如果使用cmake或其他配置包,则需要查阅安装说明。通常是README,有时是INSTALL。

相关链接(越来越旧的帖子):


2

对于 macOS,请按照以下步骤操作:

方法一

  1. 使用 homebrew 安装 gcc 编译器。(如果你还没有安装 homebrew ,请先安装)

     brew install gcc
    
  2. 假设 brew 在您的系统上安装了 gcc-12 版本,请使用以下命令进行检查:

      gcc-12 --version
    
  3. 打开终端并使用以下命令:

       cd /opt/homebrew/bin
    
  4. 下面的命令将使用 g++-12 创建符号链接以将其与 g++ 关联。通过使用它,您可以轻松地在不同版本之间切换。

       ln -s gcc-12 gcc
    

现在检查 gcc --version,它将从macOS默认的clang更改为gcc。

方法2(创建别名)

  1. 打开终端并打开 .zprofile.zshrc 文件

    open .zprofile
    
  2. 在打开的文件中添加以下行,保存并关闭它。

    alias gcc="gcc-13"
    alias g++="g++-13"
    
  3. 重新启动终端,现在只需使用 gccg++ 即可正常工作。

注意:您可以按照相同的步骤更改g++,只需将gcc-12替换为g++-12

编辑:也许在您看到这个答案时,brew会安装最新的gccg++版本,例如gcc-13等,请相应地修改命令。

  • 2023年5月5日:现在,默认情况下brew安装最新的gcc-13版本,因此请相应地使用上述命令。

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