使用 CMAKE 检查编译器中是否启用了 c++11 功能

2021-12-26 00:00:00 cmake c++ 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 文档.

相关文章