私はCMakeでプロジェクトを開発しています。私のコードにはconstexpr
、Visual Studio 2015では許可されているが、Visual Studio2013では許可されていないメソッドが含まれています。
CMakeLists.txt
指定されたコンパイラで機能がサポートされているかどうかを確認するにはどうすればよいですか?CMakeのドキュメントを見CMAKE_CXX_KNOWN_FEATURES
たことがありますが、使い方がわかりませんでした。
target_compile_featuresを使用して、C ++ 11(/ 14/17)機能を要求できます。
target_compile_features(target PRIVATE|PUBLIC|INTERFACE feature1 [feature2 ...])
にfeature1
記載されている機能ですCMAKE_CXX_KNOWN_FEATURES
。たとえばconstexpr
、パブリックAPIで使用する場合は、次を使用できます。
add_library(foo ...)
target_compile_features(foo PUBLIC cxx_constexpr)
また、オプションとして機能を検出できるWriteCompilerDetectionHeader
モジュールを確認し、コンパイラがそれらをサポートしていない場合は、一部の機能の下位互換性の実装を提供する必要があります。
write_compiler_detection_header(
FILE foo_compiler_detection.h
PREFIX FOO
COMPILERS GNU MSVC
FEATURES cxx_constexpr cxx_nullptr
)
ここで、キーワードが使用可能な場合に定義されたファイルfoo_compiler_detection.h
が生成FOO_COMPILER_CXX_CONSTEXPR
されconstexpr
ます。
#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
れ、現在のコンパイラに機能が存在する場合に拡張されます。それ以外の場合は空になります。
FOO_NULLPTR
が定義さnullptr
れ、現在のコンパイラに機能が存在する場合に展開されます。それ以外の場合は、互換性の実装に拡張されます(例NULL
)。
#include "foo_compiler_detection.h"
FOO_CONSTEXPR int bar = 0;
void baz(int* p = FOO_NULLPTR);
CMakeのドキュメントを参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加