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

时间:2019-03-07 21:31:43

标签: 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)

我将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:错误:名称空间“ std”中没有名为“ is_same_v”的模板;你是说'is_same'吗?

           (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>
              ~~~~~^
     

/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下进行搜索?

1 个答案:

答案 0 :(得分:6)

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

set(CMAKE_CXX_STANDARD 17)

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

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