Target requires the language dialect "CXX17" (with compiler extensions), but CMake does not know the compile flags to use to enable it
As mentioned is c++17 only supported by cmake version > 3.8, so I had to update it.
But my problem was my gcc and g++ didn't support it, so I had to update those, which I then did.
I followed this guide.
I was facing to the same issue, but if the answer was a good start, it wasn't enough (at least for me).
So here how I fix it (on a centos7 distro)
1. CMAKE > 3.8
On centos 'sudo yum info cmake'
says '2.8.12'
so I have had to follow those instructions: https://cmake.org/download/ to actually ends with a '3.14.5'
version
2. GCC/C++17 > 5.1.0
As mentioned by @Lamda, the tools chain need to be updated,
otherwise you will still stay stuck on the exact same error message.
Here is how CMAKE checks supported dialect: https://github.com/Kitware/CMake/blob/master/Modules/Compiler/GNU-CXX.cmake#L45
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
endif()
and again, no luck with the centos, 'sudo yum info gcc'
says '4.8.5'
I've decide to compile GCC from the source code directly, with something like this:
wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.2.0/gcc-7.2.0.tar.gz
tar -xvzf gcc-7.2.0.tar.gz
cd gcc-7.2.0
./contrib/download_prerequisites
./configure \
--enable-bootstrap \
--enable-languages=c,c++,fortran,lto \
--with-bugurl=http://bugzilla.redhat.com/bugzilla \
--enable-shared \
--enable-threads=posix \
--enable-checking=release \
--disable-multilib \
--with-system-zlib \
--enable-__cxa_atexit \
--disable-libunwind-exceptions \
--enable-gnu-unique-object \
--enable-linker-build-id \
--with-gcc-major-version-only \
--enable-plugin \
--with-linker-hash-style=gnu \
--enable-initfini-array \
--enable-libmpx \
--enable-gnu-indirect-function \
--with-tune=generic \
--build=x86_64-redhat-linux
make -j4
sudo make install
sudo sh -c 'echo /usr/local/lib > /etc/ld.so.conf.d/1-gcc.conf'
sudo sh -c 'echo /usr/local/lib64 >> /etc/ld.so.conf.d/1-gcc.conf'
sudo ldconfig -v
Hence I ends with a GCC 7.2.0.
if succeed, the following test should returns 201402L
g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
3. Still the same "dialect "CXX17" error ?
In my case, something else was needed to make it works:
sudo ln -s /usr/local/bin/gcc /usr/local/bin/cc
Why? You may ask...
GCC.7.2.0 actually don't seems to come with 'cc'
(which should be trivial symblink to 'gcc'
)
On the other hand, CMAKE determine 'g++'
path, by using 'cc'
path (as a hint)
In my case I still have a /bin/cc #4.8.5
and /bin/g++ #4.8.5
so even if a /usr/local/bin/g++ #7.2.0
now exists (which should by used in prior)
CMAKE will unfortunately used /bin/g++ #4.8.5
instead
But, obviously the best practices would be to remove the whole old GCC tool Chain.