cmake在检查头文件时使用corrext c++标准

Posted

技术标签:

【中文标题】cmake在检查头文件时使用corrext c++标准【英文标题】:cmake using corrext c++ standard when checking for header files 【发布时间】:2017-11-09 23:28:29 【问题描述】:

我正在使用 cmake 构建一个项目,该项目使用 Google 的密集哈希映射。我需要检查相应的头文件是否存在。因此我添加了

set (CMAKE_CXX_STANDARD 11)
INCLUDE (CheckIncludeFileCXX)
CHECK_INCLUDE_FILE_CXX("sparsehash/dense_hash_map" HAVE_SPARSEHASH)

致我的CMakeLists.txt。但是,我编译时找不到标头 在一些旧的编译器上。问题是头文件必须在 C++11 和这些编译器默认不是 C++11:

/usr/bin/clang++      -o CMakeFiles/cmTC_4186d.dir/CheckIncludeFile.cxx.o -c /home/florent/src/IVMPG/HPCombi/build/CMakeFiles/CMakeTmp/CheckIncludeFile.cxx
In file included from /home/florent/src/IVMPG/HPCombi/build/CMakeFiles/CMakeTmp/CheckIncludeFile.cxx:1:
In file included from /usr/local/include/sparsehash/dense_hash_map:102:
In file included from /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7/type_traits:35:

/usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7/bits/c++0x_warning.h:32:2: error: This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support \
^

因此 CMake 认为该文件不存在。

所以问题是:我如何确保我使用的是c++11(甚至是c++14) 当我测试一些包含或符号时?

【问题讨论】:

【参考方案1】:

CHECK_INCLUDE_FILE_CXX 内部使用try_compile,它在CMAKE_CXX_COMPILE_FLAGS 变量中保留编译器标志,但在CMake 3.8 之前,它didn't preserve 语言标准(如CMAKE_CXX_STANDARD 变量)。

因此,如果您的 CMake 版本为 3.7 或更低,确保检查使用 c++11 的唯一方法是在调用 CHECK_INCLUDE_FILE_CXX 之前向 CMAKE_REQUIRED_FLAGS 变量添加标准相关选项:

set(CMAKE_REQUIRED_FLAGS "-std=c++11")
...
CHECK_INCLUDE_FILE_CXX("sparsehash/dense_hash_map" HAVE_SPARSEHASH)

是的,CMAKE_CXX_STANDARD 的跨平台方面在这种情况下被破坏了。

如果你有 CMake 3.8 或更高版本,默认 CMake 的行为仍然是忽略语言标准。这样做是为了与旧版本兼容。为了保留语言标准,请将政策 CMP0067 设置为 NEW

cmake_policy(SET CMP0067 NEW)
...
CHECK_INCLUDE_FILE_CXX("sparsehash/dense_hash_map" HAVE_SPARSEHASH)

【讨论】:

我在 check_cxx_source_compiles 上的这个问题上卡了很长时间 - 事实证明,您必须在 include(CheckCXXSourceCompiles) 之前指定策略。之后更改策略无效。

以上是关于cmake在检查头文件时使用corrext c++标准的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 CMake 构建时列出 .hpp 头文件

使用 CMAKE 为 C++ 设置 Neovim

cmake: CHECK_INCLUDE_FILE_CXX 检查是否存在 codecvt 头文件

CMake:检查静态 C++ 库的可用性

使用 CMake 查找 libffi 头文件

CMake configure_file没有源代码构建