【问题标题】:Clang++-6.0 with CMake does not recognize std::string_view带有 CMake 的 Clang++-6.0 无法识别 std::string_view
【发布时间】:2018-07-06 12:30:06
【问题描述】:

我在 Linux 上使用 Clang++ 6.0、CMake 3.11.4、Make 4.1。我正在使用我自己的 CMakeLists.txt 从终端编译,其中包含 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)。但是,我需要在我的项目中使用std::string_view,并且由于某种原因,clang 无法识别它。我也包括<string>。我得到的错误是:

error: no type named 'string_view' in namespace 'std'

另外,如果我尝试#include <string_view>,我会得到:

fatal error: 'string_view' file not found

我到底错过了什么? AFAIK,string_view 是 C++17 标准的一部分,并且 Clang 从 Clang 4 开始支持 C++17,而且我使用的是相对较新的 Make 和 CMake。

【问题讨论】:

  • 您是否验证了编译器版本和 cmake 生成的 -std 标志,例如make VERBOSE=1?如果是,您能否通过调用clang++ -std=c++17 dummy.cpp 编译一个只包含<string_view> 的虚拟翻译单元?
  • 您是否尝试过使用 CMake 而不是 set: target_compile_features(project PUBLIC cxx_std_17)
  • 你确定 cmake 使用的是 Clang 吗? Linux 上的默认值通常是 GCC。
  • 好的,所以我尝试在打开详细信息的情况下运行 make,并且 1. 是的,它确实使用了 clang,但是 2. 它使用了 -std=gnu++1z。
  • 你确定标准库支持 C++17 吗?也可以将 clang 与非 c++17 标准库一起使用。

标签: c++ cmake gnu-make


【解决方案1】:

执行此要求的更现代的方式是:

target_compile_features(myTarget PRIVATE cxx_std_17)

这对编译器的能力有更好的支持,如果有兼容性问题,你更有可能让cmake报告问题。

您确实需要确认正在使用哪个版本的 clang。你说你有clang 6。但你得到-std=gnu++1z,这是cmake使用旧版本的强烈迹象。

你可以通过多种方式设置编译器,这里是使用环境:

$ export CC=/usr/bin/clang
$ export CXX=/usr/bin/clang++
$ cmake ..
-- The C compiler identification is Clang
-- The CXX compiler identification is Clang

【讨论】:

    【解决方案2】:

    最后,我通过安装 gcc-8 解决了这个问题,并且我一直使用 GNU 头文件。

    【讨论】:

      【解决方案3】:

      如果您编译投诉,您可以将 std::string_view 替换为 std::string&

      【讨论】:

      • 这些类型的性能特征非常不同
      猜你喜欢
      • 2014-09-06
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多