【问题标题】:Target requires the language dialect "CXX17" (with compiler extensions), but CMake does not know the compile flags to use to enable itTarget 需要语言方言“CXX17”(带有编译器扩展),但 CMake 不知道用于启用它的编译标志
【发布时间】:2017-11-11 13:46:29
【问题描述】:

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

我的根 CmakeList 如下所示:

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)

我在其中添加了 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

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

【问题讨论】:

  • 您使用的是哪个版本的 cmake? 17 作为 CMAKE_CXX_STANDARD 的值仅受 v3.8 支持
  • 我正在使用 cmake 3.9.6 .. 因为这个我更新了 cmake ......但解决方案显然也是升级 gcc 和 g++
  • @Lamda 如果您找到了问题的解决方案,那么您应该将其作为答案发布并最终接受。

标签: c++ cmake c++17


【解决方案1】:

如前所述,c++17 只有 cmake 版本 > 3.8 才支持,所以我不得不更新它。

但我的问题是我的 gcc 和 g++ 不支持它,所以我必须更新它们,然后我做了。

我关注了这个guide

【讨论】:

    【解决方案2】:

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

    那么我如何解决它(在 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()
    

    再一次,centos 运气不好,'sudo yum info gcc''4.8.5'

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

    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
    

    因此我以 GCC 7.2.0 结束。

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

    g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
    

    3。还是一样的“方言“CXX17”错误?

    在我的情况下,需要其他东西才能使其工作:

    sudo ln -s /usr/local/bin/gcc /usr/local/bin/cc
    

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

    GCC.7.2.0 实际上似乎没有附带'cc' (这应该是'gcc' 的简单符号链接)

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

    就我而言,我仍然有 /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 命令选项并且工作正常。
    • EPEL 存储库提供了最新的 CMake 版本(包名称为 cmake3,与可执行文件相同)。
    【解决方案3】:

    关于 gcc 的更新

    从源代码构建我们自己的 GCC 实际上是个坏主意...

    在我的情况下,我尝试与外部库链接时遇到了一些错误(即使使用相同的 c++ 标准/GCC 版本)

    最好的做法似乎是使用 devtoolset yum 包代替 https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/

    似乎这个软件包是通过为您包含一些 Redhat 补丁和配置开关而制作的。到目前为止,我们还不知道让它正常工作的神奇秘诀,使用更官方的东西是有意义的。

    结论: 改用 devtoolset yum 包或尝试从源代码编译 GCC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 2019-02-19
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2010-12-24
      相关资源
      最近更新 更多