check if a c++11 feature is enabled in compiler with CMAKE(使用 CMAKE 检查编译器中是否启用了 c++11 功能)
问题描述
我正在使用 CMake 开发一个项目.我的代码包含 constexpr 方法,在 Visual Studio 2015 中允许,但在 Visual Studio 2013 中不允许.
I'm developing a project with CMake. My code contains constexpr
methods, that are allowed in Visual Studio 2015, but not in Visual Studio 2013.
如果指定的编译器支持该功能,我如何检查 CMakeLists.txt
?我在 CMake 文档中看到 CMAKE_CXX_KNOWN_FEATURES
,但我不明白如何使用它.
How can I check in the CMakeLists.txt
if the feature is supported by the specified compiler? I've seen in CMake documentation CMAKE_CXX_KNOWN_FEATURES
, but I didn't understand how to use it.
推荐答案
您可以使用 target_compile_features 需要 C++11(/14/17) 特性:
You can use target_compile_features to require a C++11(/14/17) feature:
target_compile_features(target PRIVATE|PUBLIC|INTERFACE feature1 [feature2 ...])
feature1
是 <代码>CMAKE_CXX_KNOWN_FEATURES.例如,如果你想在你的公共 API 中使用 constexpr
,你可以使用:
add_library(foo ...)
target_compile_features(foo PUBLIC cxx_constexpr)
<小时>
您还应该查看 WriteCompilerDetectionHeader
模块,它允许将特性检测为选项,并在编译器不支持某些特性时提供向后兼容性实现:
You should also take a look at the WriteCompilerDetectionHeader
module which allows to detect features as options, and provides a backward compatibility implementation for some features if the compiler does not support them:
write_compiler_detection_header(
FILE foo_compiler_detection.h
PREFIX FOO
COMPILERS GNU MSVC
FEATURES cxx_constexpr cxx_nullptr
)
如果关键字constexpr
可用,这里将生成一个文件foo_compiler_detection.h
,其中定义了FOO_COMPILER_CXX_CONSTEXPR
:
Here a file foo_compiler_detection.h
will be generated with FOO_COMPILER_CXX_CONSTEXPR
defined if the keyword constexpr
is available:
#include "foo_compiler_detection.h"
#if FOO_COMPILER_CXX_CONSTEXPR
// implementation with constexpr available
constexpr int bar = 0;
#else
// implementation with constexpr not available
const int bar = 0;
#endif
此外,如果当前编译器存在该功能,FOO_CONSTEXPR
将被定义并扩展为 constexpr
.否则为空.
Moreover, FOO_CONSTEXPR
will be defined and will expand to constexpr
if the feature exists for the current compiler. It will be empty otherwise.
FOO_NULLPTR
将被定义并扩展为 nullptr
如果当前编译器存在该功能.否则它将扩展为兼容性实现(例如 NULL
).
FOO_NULLPTR
will be defined and will expand to nullptr
if the feature exists for the current compiler. It will expand to a compatibility implementation otherwise (e.g. NULL
).
#include "foo_compiler_detection.h"
FOO_CONSTEXPR int bar = 0;
void baz(int* p = FOO_NULLPTR);
请参阅 CMake 文档.
这篇关于使用 CMAKE 检查编译器中是否启用了 c++11 功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 CMAKE 检查编译器中是否启用了 c++11 功能
- 使用/clr 时出现 LNK2022 错误 2022-01-01
- 静态初始化顺序失败 2022-01-01
- 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
- 如何对自定义类的向量使用std::find()? 2022-11-07
- 从python回调到c++的选项 2022-11-16
- 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
- STL 中有 dereference_iterator 吗? 2022-01-01
- Stroustrup 的 Simple_window.h 2022-01-01
- C++ 协变模板 2021-01-01
- 近似搜索的工作原理 2021-01-01