首页 > 解决方案 > 通过 CMake 工具链包含正确版本的 STL 标头

问题描述

我正在尝试建立一个与 C++ 一起使用的 CI 管道。我的 Docker 容器不支持 C++17,所以我想从 LLVM 页面下载一个版本并正确设置。然后我在/opt/clang7. 我还使用了一个 CMake 工具链文件,以便从这个 clang 发行版中获取包含和库等。这是我的工具链文件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:错误:没有名为“is_same_v”的模板' 在命名空间 'std' 中;你是说'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”结构相同 ^

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

标签: c++cmakeclang++

解决方案


而不是手动变异CMAKE_CXX_FLAGS(你不应该!)尝试设置 cmake 使用的 C++ 标准:

set(CMAKE_CXX_STANDARD 17)

把它放在定义目标之前。

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


推荐阅读