Reputation: 304142
I have a part of my CMakeLists.txt
that sets the C++ standard:
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 11)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
This seems to work fine... mostly. I have a build directory, which I set up via:
$ cmake -G Ninja -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 ../gw3
Built my project on clang, fixed a few things, normal work stuff. Then I wanted to check to see if I broke the gcc build, so, in the same directory, I ran:
$ cmake -G Ninja -DCMAKE_CXX_COMPILER=$(which g++) -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 ../gw3
This emited:
-- 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 ...
At this point though, CMAKE_CXX_STANDARD
is set to 11
in the cache! Why? I set it on the command line to 17. If I rereun the same cmake
command again (verbatim, just up-arrow, enter), then the CMAKE_CXX_STANDARD
variable gets set to 17
as desired. What gives?
Upvotes: 0
Views: 2746
Reputation: 330
The conventional way to avoid this error is to set the compiler via an environmental variable, i.e:
$ 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 doesn't like it when you try to change CMAKE_CXX_COMPILER
. From the FAQ:
I change CMAKE_C_COMPILER in the GUI but it changes back on the next configure step. Why?
Once a build tree is created with a given compiler it cannot be changed. There are a variety of implementation reasons for this policy.
Upvotes: 3