我试图建立一个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'吗?
Run Code Online (Sandbox Code Playgroud)(!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?
而不是CMAKE_CXX_FLAGS手动更改(您不应该!),请尝试设置cmake使用的C ++标准:
set(CMAKE_CXX_STANDARD 17)
Run Code Online (Sandbox Code Playgroud)
在定义目标之前将其放置。
然后,默认情况下clang将默认使用libstdc ++。要使所有C ++ 17功能可用,只需升级GCC。