在调用 cmake 之前不要覆盖CMAKE_C_COMPILER,而是导出CC(和CXX):
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
只需要导出一次,在你第一次配置项目时,那些值将从 CMake 缓存中读取。
更新:关于在 Jake 发表评论后为什么不覆盖 CMAKE_C(XX)_COMPILER 的详细解释
我建议不要覆盖 CMAKE_C(XX)_COMPILER 值,主要原因有两个:因为它不能很好地与 CMake 的缓存配合使用,而且它会破坏编译器检查和工具检测。
使用set 命令时,您有三个选项:
- 不带缓存,创建普通变量
- 带缓存,创建缓存变量
- 强制缓存,配置时始终强制缓存值
让我们看看对set 的三个可能调用会发生什么:
无缓存
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
执行此操作时,您创建了一个“普通”变量CMAKE_C(XX)_COMPILER,它隐藏了同名的缓存变量。这意味着您的编译器现在在您的构建脚本中被硬编码,并且您不能给它一个自定义值。如果您有多个使用不同编译器的构建环境,这将是一个问题。您可以在每次想要使用不同的编译器时更新您的脚本,但这首先会消除使用 CMake 的价值。
好的,那么,让我们更新缓存...
带缓存
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
这个版本只是“不工作”。 CMAKE_C(XX)_COMPILER 变量已经在缓存中,所以它不会被更新,除非你强制它。
啊……让我们用武力,然后……
强制缓存
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
这与“普通”变量版本几乎相同,唯一的区别是您的值将被设置在缓存中,因此用户可以看到它。但是任何更改都会被set 命令覆盖。
破坏编译器检查和工具
在配置过程的早期,CMake 会对编译器进行检查:它是否工作?它能够生成可执行文件吗?等。它还使用编译器检测相关工具,如ar和ranlib。当您在脚本中覆盖编译器值时,“为时已晚”,所有检查和检测都已完成。
例如,在我使用 gcc 作为默认编译器的机器上,当使用 set 命令到 /usr/bin/clang 时,ar 设置为 /usr/bin/gcc-ar-7。在运行 CMake 之前使用导出时,它设置为 /usr/lib/llvm-3.8/bin/llvm-ar。