通过CMake工具链包括正确版本的STL标头

meg*_*uli 3 c++ cmake clang++

我试图建立一个CI管道与C ++一起使用。我拥有的Docker容器不支持C ++ 17,所以我想从LLVM页面下载一个发行版并正确设置。然后,我将其提取/opt/clang7。我还使用CMake工具链文件,以便它将从此clang发行版中获取include和libs等。这是我的工具链文件clang7-ci.cmake

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

SET(CMAKE_C_COMPILER   /opt/clang7/bin/clang)
SET(CMAKE_CXX_COMPILER /opt/clang7/bin/clang++)

SET(CMAKE_FIND_ROOT_PATH  /opt/clang7)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)

我称其为CMake配置,cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/clang7-ci.cmake ..似乎是从工具链中获取了正确的clang和clang ++。正如我在CMake的配置输出中看到的那样:

-C编译器标识为Clang 7.0.1

-CXX编译器标识为Clang 7.0.1

-检查工作的C编译器:/ opt / clang7 / bin / clang

-检查工作的C编译器:/ opt / clang7 / bin / clang-工作

因此,我假设它正确使用了工具链目录,否则它将如何找到我设置的C ++编译器为clang ++。尽管如此,当我尝试使用以下命令进行构建时,它仍然给我以下错误cmake --build .

在/builds/meguli/chops/tests/answer_life/answer_life.cpp:2包含的文件中:/builds/meguli/chops/tests/answer_life/../catch.hpp:644:10:错误:没有名为'is_same_v的模板'在命名空间'std'中;你是说'is_same'吗?

           (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>
              ~~~~~^
Run Code Online (Sandbox Code Playgroud)

/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/type_traits:1517:12:注意:此处声明为'is_same'结构is_same ^

如您所见,它将在主机目录中/usr/lib/.../inclue/6.3.0查找包含文件。这不是我想要的,我想为C ++ 17构建,我希望它包括clang发行版中的标头。我设置SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)为它将在工具链中搜索包含目录,但是它不起作用。我怎样才能让它只在下搜索/opt/clang7

Gui*_*cot 6

而不是CMAKE_CXX_FLAGS手动更改(您不应该!),请尝试设置cmake使用的C ++标准:

set(CMAKE_CXX_STANDARD 17)
Run Code Online (Sandbox Code Playgroud)

在定义目标之前将其放置。

然后,默认情况下clang将默认使用libstdc ++。要使所有C ++ 17功能可用,只需升级GCC。