我试图建立一个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
下进行搜索?
答案 0 :(得分:6)
代替手动更改CMAKE_CXX_FLAGS
(您不应该!),请尝试设置cmake使用的C ++标准:
set(CMAKE_CXX_STANDARD 17)
在定义目标之前将其放置。
然后,默认情况下clang将默认使用libstdc ++。要使所有C ++ 17功能都可用,只需升级GCC。