2017-03-29 9 views
1

ドキュメントによれば、CXX_STANDARD_REQUIREDからONに設定すると、ビルドシステムで古いC++標準を使用してから、CXX_STANDARDで要求したものが使用できなくなります。最小限必要なC++標準を指定する

しかし、WriteCompilerDetectionHeaderモジュールと組み合わせると、 "面白い"問題が発生します。例えばcxx_relaxed_constexprため

set(CMAKE_CXX_STANDARD 11)とテスト、その後、条件付きCXX_STANDARDの要件とマクロの使用がそうであるようにGCC 6.3.0でコンパイルエラーにconstexprリードに展開されるマクロを定義:「上位互換性」のいくつかのフォームを提供するとき競合する(実際のフィーチャセットを使用するフィーチャヘッダー、C++ 11が必要なときにコンパイラによって提供されるものではない)。

最近の標準(C++ 11以降など)を禁止することなく、必要最小限のC++標準を指定する方法はありますか?私が現在考えることのできる唯一の回避策は、CXX_STANDARDCXX_STANDARD_REQUIREDを一切設定せず、単に「非公式に」最小限のバージョンのC++を必要とすることです。

答えて

0

いいえ、これを簡単に行う方法はありません。特定の標準までオブジェクトを連続的にコンパイルするようにCMakeを拡張することはできますが、これにはかなりの労力がかかります。あなたの状況に応じてあなたが望むことを行う方法があります。

  • 矛盾しないマクロを使用してください。あなたの例を使用して、代わりに標準

  • に基づいて#define constexpr ...

  • 使用大きな条件付きブロックの#define MYCONSTEXPR ...を使用するプロジェクトは、主に一つの標準ですが、別のものを必要とするいくつかのファイルがありますか? CMakeのset_source_files_properties()を使用して、新しいCXX_STANDARDまたはCOMPILE_FLAGSを設定してください。

+0

簡単に行うことができない理由を、私は一般的に、それはありませんので、私は単にそれが簡単に行われていないオプションを追加し、...、ユーザが使用すべき標準を決める – MFH

+0

を持っていますね、私は理解していないけれども標準のコンパイラオプションの仕組みこれは最小値でも最大値でもありません。それは絶対値です。たとえば、 '-std = C++ 11'を' g ++ 'に与えると、コンパイラにC++ 11コードだけを期待するように指示します。 C++ 14またはC++ 17のいずれの構文もエラーになります。 C++ 11で削除された以前のバージョンの標準のものはエラーになります。セマンティクスはコンパイラによって多少異なる場合がありますので、コンパイラオプションのドキュメントをよくお読みください。 – nega

+0

これは当てはまりますが、これはコンパイラ自体ではなくビルドシステムによって解決できるはずです。 (すべてのCMakeがコンパイラがどの言語バージョンをサポートしているかを "魔法のように"知っている)...注意:CMakeは、CXX_STANDARD_REQUIREDがOFF(デフォルトでさえも)の場合、古い標準へのフォールバックをサポートしています... – MFH

関連する問題