包括通过CMAKE工具链正确版本的STL标题



我正在尝试设置一个与C 一起使用的CI管道。Docker容器我不支持C 17,因此我想从LLVM页面下载版本并正确设置该版本。然后,我在/opt/clang7下提取。我还使用一个CMAKE工具链文件,以便从此叮当声中获取和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编译器识别是叮当声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'in namespace'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:12:注意:'is_same'在这里宣布 struct is_same ^

如您所见,它正在查看/usr/lib/.../inclue/6.3.0的主机目录以获取文件。这不是我想要的,我想为C 17构建,我希望它包括Clang发行版中的标题。我设置了SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY),以便它可以搜索工具链以获取包含目录,但它不起作用。如何仅在/opt/clang7下搜索?

,而不是手动突变CMAKE_CXX_FLAGS(您不应该!)尝试设置CMAKE使用的C 标准:

set(CMAKE_CXX_STANDARD 17)

将其放在定义目标之前。

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

最新更新