【问题标题】:How can I make CMake use GCC instead of Clang on Mac OS X?如何让 CMake 在 Mac OS X 上使用 GCC 而不是 Clang?
【发布时间】:2014-08-14 08:25:33
【问题描述】:

我找不到任何关于它的信息,但只能找到相反的信息(例如,如何设置 CMake 以使用 clang)。

我已经使用 brew 安装了 gcc-4.8,设置了所有依赖项、头文件等,现在 CMake 拒绝使用 gcc。

我已经使用别名和实际条目设置了我的 bash 配置文件:

export CC=/usr/bin/gcc
export CXX=/usr/bin/g++
alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

然而 CMake 顽固地拒绝使用 gcc,而是恢复到 clang:

air:build alex$ cmake -DCMAKE_BUILD_TYPE=DEBUG ..
-- The C compiler identification is Clang 5.1.0
-- The CXX compiler identification is Clang 5.1.0
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works

【问题讨论】:

  • 我发现的唯一方法是更改​​ /usr/bin 中的符号链接,这很乏味 - 必须有更好的方法。

标签: c++ cmake


【解决方案1】:

CMake 不(总是)听CCCXX。而是使用CMAKE_C_COMPILERCMAKE_CXX_COMPILER

cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ ...

另请参阅documentation

或者,您可以提供toolchain file,但在这种情况下,这可能是多余的。

【讨论】:

  • @Alex:你为什么要这么做? CMakelists.txt 旨在尽可能地与平台/工具链无关。不要把任何事情强加于任何人。另请参阅this CMake Wiki entry。使用-D 语法是Correct™ 方式。
  • @Pietro 这就是为什么您不会在 CMakelists.txt 中对工具链进行硬编码的原因,而是当您在 macbook 上使用 GCC 进行测试构建时,请使用上述命令(或一些变化当然是正确的路径...)。
  • 这个答案不正确。 CMake 确实尊重 CC 和 CXX 环境变量。唯一需要注意的是,您必须在运行 CMake 之前设置它们,而不是在生成的构建目录中运行 make 之前。此外,CMake 会缓存这些变量的值,因此一旦创建了构建目录,您可能需要删除该目录并在更改编译器时重新生成它。
  • 至于现在(3 年后)CMake 在 Linux 上荣誉 CCCXX,但在 MacOS 上则不行。再次遇到问题...
  • @Eric CC/CXX 仅用于Makefile(所有变体)和Ninja 生成器。
【解决方案2】:

当前版本的 CMake 不像人们期望的那样尊重 CC 和 CXX 环境变量。特别是如果它们是编译器二进制文件的绝对路径,它们似乎被忽略了。在我的系统上使用新编译的 cmake 3.7.1 我必须做cmake -H. -Bbuild -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX

正如其他人所说,在 CMakeLists.txt 中强制选择编译器并不是一个好主意,但是如果您的用例需要这样做,那么您可以这样做:

cmake_minimum_required(VERSION 3.5) # Or whatever version you use

# THIS HAS TO COME BEFORE THE PROJECT LINE
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
# THIS HAS TO COME BEFORE THE PROJECT LINE

project(my_project VERSION 0.0.0 LANGUAGES C CXX)

在这种情况下,如果找不到指定的编译器,cmake 将失败。请注意,您必须在项目行之前设置这些变量,因为此命令用于查找和配置编译器。

【讨论】:

    【解决方案3】:

    我猜OP中的案例是在macOS上运行的,真正的问题是/usr/bin/gcc/usr/bin/g++默认是clangclang++

    % ls -al /usr/bin/clang
    -rwxr-xr-x  1 root  wheel  167088  8 Dec 07:39 /usr/bin/clang
    % ls -al /usr/bin/gcc
    -rwxr-xr-x  1 root  wheel  167088  8 Dec 07:39 /usr/bin/gcc
    % /usr/bin/gcc --version
    Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
    Apple clang version 13.0.0 (clang-1300.0.29.30)
    Target: x86_64-apple-darwin21.2.0
    Thread model: posix
    InstalledDir: /Library/Developer/CommandLineTools/usr/bin
    

    避免这种情况的一种方法是安装 gcc/g++,然后使用版本化的二进制名称。

    % which gcc-11 g++-11
    /usr/local/bin/gcc-11
    /usr/local/bin/g++-11
    % gcc-11 --version
    gcc-11 (Homebrew GCC 11.2.0_3) 11.2.0
    Copyright (C) 2021 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.
    

    所以,而不是

    cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++
    

    有人会使用

    cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/bin/g++-11
    

    【讨论】:

      【解决方案4】:

      使用CCCXX 环境变量应该足够了,但在macOS 中不能“按预期工作”。

      但它以这种方式工作,例如:

      CXX="gcc-8" CC="gcc-8" cmake ..
      

      【讨论】:

        【解决方案5】:

        补充一点,还有一个 CMake 变量 CMAKE_Fortran_COMPILER 来获取 GNU FORTRAN 而不是 clang FORTRAN。但是documentation中似乎缺少它

        cmake -DCMAKE_Fortran_COMPILER=/usr/.../bin/gfortran-6.x.0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 1970-01-01
          • 1970-01-01
          • 2021-05-01
          相关资源
          最近更新 更多