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

84

我无法找到有关这方面的信息,只能找到另一种方式(例如如何设置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中的符号链接,这很繁琐 - 必须有更好的方法。 - Paul R
5个回答

122

CMake并不总是听从CCCXX,而是使用CMAKE_C_COMPILERCMAKE_CXX_COMPILER

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

此外,请参阅文档

或者,您可以提供工具链文件,但在这种情况下可能过于复杂。


6
@Alex:为什么你要这样做?CMakelists.txt 应该尽可能与平台/工具链无关。不要强加给任何人。此外,请参见此CMake Wiki条目。使用 -D 语法是“正确™”的方法。 - rubenvb
3
正因为如此,你不应该在CMakelists.txt中硬编码工具链,而是在使用GCC在MacBook上进行测试构建时,使用上述命令(或某些带有正确路径的变体...)。 - rubenvb
21
这个答案不正确。CMake确实会遵循CC和CXX环境变量,唯一的注意事项是您必须在运行CMake之前设置它们,而不是在生成的构建目录中运行make之前。此外,CMake会缓存这些变量的值,因此一旦创建了构建目录,如果要更改编译器,则可能需要删除该目录并重新生成它。 - cmccabe
2
目前(三年后),CMake在Linux上支持CCCXX,但在MacOS上不支持。再次遇到了这个问题... - Eric Platon
2
@Eric,CC/CXX 只在 Makefile(所有变体)和 Ninja 生成器中使用。 - rubenvb
显示剩余6条评论

18

目前的 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 将失败。请注意,在项目行之前设置这些变量,因为此命令会查找和配置编译器。
在这种情况下,如果未找到指定的编译器,CMake 将失败。请注意,在项目行之前设置这些变量,因为此命令会查找和配置编译器。

11

我猜 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/local/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++-11

在我的情况下(MacOS Monterey),CC和CXX为空,我添加了别名到正确的gcc(而不是XCode设置的默认gcc clang),但仍然无法让cmake使用这些别名,而是使用绝对路径指向XCode工具。就像你所说,必须将编译器指定给CMake,但这与操作系统或系统无关,因为CMake无论如何都会忽略所有这些。 - ymoreau

1

使用CCCXX环境变量应该足够了,但在macOS上它们并没有“按预期工作”。

但实际上它是这样工作的:

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

1

补充一点,还有一个CMake变量CMAKE_Fortran_COMPILER,可以选择GNU FORTRAN而不是clang FORTRAN。但是在文档中好像缺失了。

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

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