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

时间:2017-11-09 23:28:29

标签: cmake compiler-options

我正在使用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 个答案:

答案 0 :(得分:1)

CHECK_INCLUDE_FILE_CXX内部使用try_compile,它保留 CMAKE_CXX_COMPILE_FLAGS 变量中的编译器标志,但是,直到CMake 3.8,它didn't preserve 语言标准< / em>(例如 CMAKE_CXX_STANDARD 变量)。

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

CHECK_INCLUDE_FILE_CXX

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

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

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