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.

Tags:

C++

C++17

Cmake