c++ - 通过 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
?
解决方案
而不是手动变异CMAKE_CXX_FLAGS
(你不应该!)尝试设置 cmake 使用的 C++ 标准:
set(CMAKE_CXX_STANDARD 17)
把它放在定义目标之前。
然后,默认情况下,clang 将默认使用 libstdc++。要使所有 C++17 功能可用,只需升级 GCC。
推荐阅读
- python - Pandas function hat prints the value of a column from antoher data frame
- flutter - 带有动画提示/标签的 TextField
- webdriver-io - 如何阻止 webdriverIo 测试运行器关闭浏览器
- elasticsearch - KEY 为 Null 的 Elasticsearch 查询
- c# - C# 使用构造函数设置多维数组的值
- android - 如何从网络而不是从 http 缓存中获取数据?
- c++ - 如何正确使用 QLayouts(hbox、vbox 等)?
- python - 如何将列表拆分为相等的子列表,最后一个子列表由列表的第一个可能元素组成
- arrays - 使用 Typescript 从数组中的键返回最大的数字
- c# - 您如何根据在此问题中所做的按键字母选择列表框中的项目,但在 UWP 中?