某些更改时删除了cmake缓存变量

时间:2018-01-09 23:41:06

标签: cmake

我的CMakeLists.txt部分设置了C ++标准:

if(NOT CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 11)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

这似乎工作得很好......主要是。我有一个构建目录,我通过以下方式设置:

$ cmake -G Ninja -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_BUILD_TYPE=Release \
                 -DCMAKE_CXX_STANDARD=17  ../gw3

在clang上构建我的项目,修正了一些东西,正常的工作。然后我想查看是否打破了gcc构建,因此,在同一目录中,我运行了:

$ cmake -G Ninja -DCMAKE_CXX_COMPILER=$(which g++) -DCMAKE_BUILD_TYPE=Release \
                 -DCMAKE_CXX_STANDARD=17  ../gw3

这已经退出:

-- Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_CXX_COMPILER= /path/to/bin/g++
CMAKE_CXX_COMPILER= /path/to/bin/g++
CMAKE_CXX_COMPILER= /path/to/bin/g++
CMAKE_CXX_COMPILER= /path/to/bin/g++
... like 20 more times ...

-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 7.2.0
... more cmake stuff here ...

此时,CMAKE_CXX_STANDARD在缓存中设置为11!为什么?我在命令行上将它设置为17.如果我再次重新运行相同的cmake命令(逐字,只需向上箭头,输入),然后 { {1}}变量根据需要设置为CMAKE_CXX_STANDARD。是什么给了什么?

1 个答案:

答案 0 :(得分:2)

避免此错误的传统方法是通过环境变量设置编译器,即:

$ CXX=clang++ cmake .. -DCMAKE_CXX_STANDARD=17
# ...
$ cat CMakeCache.txt | grep STANDARD
CMAKE_CXX_STANDARD:STRING=17
$ env CXX=g++ cmake .. -DCMAKE_CXX_STANDARD=17
# ...
$ cat CMakeCache.txt | grep STANDARD
CMAKE_CXX_STANDARD:STRING=17 

当您尝试更改CMAKE_CXX_COMPILER时,CMake不喜欢它。来自FAQ

  

我在GUI中更改了CMAKE_C_COMPILER,但它在下一个配置步骤中更改回来。为什么?

     

使用给定的编译器创建构建树后,它不可能   改变。这有多种实现原因   政策。