Target需要语言方言"CXX17"(带编译器扩展),但CMake不知道用于启用它的编译标志

Lam*_*mda 8 c++ cmake c++17

所以我一直在尝试将其<filesystem>纳入我的项目中,这似乎是一个比我想象的更大的问题. <filesystem>应该是c ++ 17的一部分,我需要将该定义添加到我的CMakeList中.

我的根CmakeLists看起来像这样:

MESSAGE(“In src CMAKELIST”)

#
# Build everything in include/ directory
add_subdirectory(include)
#

#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

## Main executable target
add_executable(cmakeDemo main.cpp)

# These libraries get built in include/*/, CMake will auto-set required
# compiler flags and include paths from their definitions
target_link_libraries(cmakeDemo record ${portaudio})
target_link_libraries(cmakeDemo database)
target_link_libraries(cmakeDemo match)
target_link_libraries(cmakeDemo spectogram)
Run Code Online (Sandbox Code Playgroud)

我在其中添加了c ++ 17定义,但是当我编译系统时,我收到此错误:

 make 
“InsrcCMAKELIST”
“InincludeCMAKELIST”
“IndatabaseCMAKELIST”
“InmatchCMAKELIST”
“InrecordCMAKELIST”
“InspectogramCMAKELIST”
/home/lamda/soundcloud/src/include/spectogram/base/base.h
“outspectogramCMAKELIST”
-- Configuring done
CMake Error in src/CMakeLists.txt:
  Target "cmakeDemo" requires the language dialect "CXX17" (with compiler
  extensions), but CMake does not know the compile flags to use to enable it.


-- Generating done
-- Build files have been written to: /home/lamda/soundcloud/build
make: *** [cmake_check_build_system] Error 1
Run Code Online (Sandbox Code Playgroud)

但不知何故不是它愿意使用c ++ 17,所以我可以使用这个filesystem库吗?为什么?

Lam*_*mda 10

如前所述,c ++ 17只支持c ++版本,因此我不得不更新它.

但我的问题是我的gcc和g ++不支持它,所以我不得不更新那些,然后我做了.

我按照这个指南.


cht*_*i59 5

我正面临着同样的问题,但如果答案是一个好的开始,那还不够(至少对我而言)。

所以在这里我如何修复它(在centos7发行版上)

1. CMAKE > 3.8

在 centos 上'sudo yum info cmake''2.8.12'

所以我不得不遵循这些说明:https : //cmake.org/download/实际上以一个'3.14.5'版本结束

2. GCC/C++17 > 5.1.0

正如@Lamda 提到的,工具链需要更新,

否则你仍然会停留在完全相同的错误消息上。

以下是 CMAKE 检查支持的方言的方式: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()
Run Code Online (Sandbox Code Playgroud)

再说一次,centos 没有运气,'sudo yum info gcc''4.8.5'

我决定直接从源代码编译 GCC,如下所示:

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()
Run Code Online (Sandbox Code Playgroud)

因此我以 GCC 7.2.0 结束。

如果成功,下面的测试应该返回 201402L

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
Run Code Online (Sandbox Code Playgroud)

3.还是同样的“方言“CXX17”错误?

就我而言,还需要其他一些东西才能使其正常工作:

g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
Run Code Online (Sandbox Code Playgroud)

为什么?你可能会问...

GCC.7.2.0 实际上似乎没有附带'cc' (这应该是微不足道的符号链接'gcc'

另一方面,CMAKE'g++'通过使用'cc'路径(作为提示)确定路径

就我而言,我仍然有一个/bin/cc #4.8.5/bin/g++ #4.8.5

所以即使/usr/local/bin/g++ #7.2.0现在存在(应该在之前使用)

不幸的是,CMAKE 将/bin/g++ #4.8.5改为使用

但是,显然最佳实践是删除整个旧的 GCC 工具链。

  • 我已将 -DCMAKE_C_COMPILER=/usr/local/bin/gcc 和 -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ 设置为 cmake 命令选项,并且工作正常。 (3认同)