如何让CMake在Mac OS X上使用GCC而不是Clang?

Æle*_*lex 54 c++ cmake

我找不到任何关于它的信息,但只有相反的方式(例如,如何设置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'
Run Code Online (Sandbox Code Playgroud)

然而,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
Run Code Online (Sandbox Code Playgroud)

rub*_*nvb 78

CMake不听CCCXX.而是使用CMAKE_C_COMPILERCMAKE_CXX_COMPILER:

cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ ...
Run Code Online (Sandbox Code Playgroud)

另请参阅文档.

或者,您可以提供工具链文件,但在这种情况下可能有点过分.

  • 这个答案是不正确的.CMake确实尊重CC和CXX环境变​​量.唯一需要注意的是,必须在运行CMake之前设置它们,而不是在生成的构建目录中运行make之前.此外,CMake会缓存这些变量的值,因此一旦创建了构建目录,您可能需要删除该目录并在更改编译器时重新生成它. (13认同)
  • @Alex:你为什么这样做?`CMakelists.txt`意味着尽可能地与平台/工具链无关.不要强迫任何人.另请参阅[此CMake Wiki条目](http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F).使用`-D`语法是`Correct™'方式. (4认同)
  • @Pietro这正是为什么你不硬编码工具链在您的CMakeLists.txt,而是,当你做与GCC测试建立在你的MacBook,使用上面的命令(或当然的正确路径一些变化. ..). (3认同)
  • 目前(3 年后)CMake 在 Linux 上支持“CC”和“CXX”,但在 MacOS 上则不支持。又遇到问题了... (2认同)
  • @Eric“CC”/“CXX”仅在“Makefile”(所有变体)和“Ninja”生成器的情况下使用。 (2认同)

小智 12

我猜 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
Run Code Online (Sandbox Code Playgroud)

避免这种情况的一种方法是安装 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.
Run Code Online (Sandbox Code Playgroud)

所以,而不是

cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++
Run Code Online (Sandbox Code Playgroud)

有人会用

cmake .. -DCMAKE_C_COMPILER=/usr/local/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-11
Run Code Online (Sandbox Code Playgroud)


Nor*_*ter 8

当前版本的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)
Run Code Online (Sandbox Code Playgroud)

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