不要覆盖CMAKE_C_COMPILER,但出口CC(和CXX)调用cmake的面前:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
出口只需要进行一次,首次配置了项目,那么这些值将从CMake缓存中读取。
UPDATE:因为它不会通过CMake的缓存,因为它发挥出色:对杰克的评论
我建议不要重写CMAKE_C(XX)_COMPILER价值主要有两个原因后,为什么不重写CMAKE_C(XX)_COMPILER较长的解释打破编译器检查和工具检测。
当使用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。