Answers:
不要覆盖CMAKE_C_COMPILER
,而是在调用cmake之前导出CC
(和CXX
):
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
首次配置项目时,只需要执行一次导出,然后将从CMake缓存中读取这些值。
更新:关于为什么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
命令to时/usr/bin/clang
,ar
设置为/usr/bin/gcc-ar-7
。在运行CMake之前使用导出时,将其设置为/usr/lib/llvm-3.8/bin/llvm-ar
。
which gcc
> export CXX =which g++
export CC=`which gcc` export CXX=`which g++`
Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
CMAKE_C_COMPILER
如果您使用以下命令行进行设置,则设置效果很好$ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
。
这个问题已经很老了,但仍然出现在Google搜索上。可以接受的问题不再对我有用,并且似乎已经老了。有关cmake的最新信息写在cmake FAQ中。
有多种方法可以更改编译器的路径。一种方法是
使用将适当的
CMAKE_FOO_COMPILER
变量设置为有效的编译器名称或命令行上的完整路径cmake -D
。例如:cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source
而不是gcc-4.2
你可以写path/to/your/compiler
这样的
cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .
设置CMAKE_C_COMPILER
为新路径。
CMAKE_<LANG>_COMPILER
路径而不触发重新配置我想使用备用编译器进行编译,但也希望在命令行中传递-D选项,而通过设置其他编译器会使其消失。发生这种情况是因为它触发了重新配置。诀窍是使用禁用编译器检测,然后使用NONE
设置路径。FORCE
enable_language
project( sample_project NONE )
set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" FORCE )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" FORCE )
enable_language( C CXX )
更为明智的选择是创建一个工具链文件。
set( CMAKE_SYSTEM_NAME Darwin )
set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" )
然后,您使用附加标志调用Cmake
cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
/opt
而不是中是一个好习惯/usr/local
。最好/opt/gcc-x.y.z
。这样,如果您需要更新的版本,则卸载前一个版本将没有任何麻烦。