[解決済み] CMake でコンパイラの C++11 サポートを検出する方法
質問
コンパイラが C++11 をサポートしているかどうかを CMake が自動的に検出する方法はありますか?
CMake の実行中に、コンパイラが C++11 をサポートしていないためコードがコンパイルされないことをユーザーに知らせることができれば良いと思います。 現在、私は C++11 フラグを設定しています。しかし、コンパイラーがそれをサポートしていない場合、ユーザーは CMake 実行中にエラーではなく、コンパイル エラーを受け取ります。
完璧なのは、次のように動作するものです。
find_package()
. しかし、私は必要な機能を提供するモジュールまたは関数を見つけられませんでした。
追加で、コンパイラがフラグを必要とするかどうかを検出する機能があるとよいでしょう。
std=c++0x
とか
std=c++11
.
何か利用できるものがあるのでしょうか、それとも自分で開発する必要があるのでしょうか。
以下は私がこれまでに使用したコードですが、これは GNU'c GCC コンパイラでのみ動作します。より一般的なソリューションがあるならば、それは素晴らしいことです。
if(CMAKE_COMPILER_IS_GNUCXX)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)
message(STATUS "C++11 activated.")
add_definitions("-std=gnu++11")
elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
message(WARNING "C++0x activated. If you get any errors update to a compiler which fully supports C++11")
add_definitions("-std=gnu++0x")
else ()
message(FATAL_ERROR "C++11 needed. Therefore a gcc compiler with a version higher than 4.3 is needed.")
endif()
else(CMAKE_COMPILER_IS_GNUCXX)
add_definitions("-std=c++0x")
endif(CMAKE_COMPILER_IS_GNUCXX)
どのように解決するのですか?
CMake バージョン 3.1.0 以降では、どの C++ 機能がサポートされているかを検出することができます。 C++ コンパイラーがサポートしている
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
message("Your C++ compiler supports these C++ features:")
foreach(i ${CMAKE_CXX_COMPILE_FEATURES})
message("${i}")
endforeach()
しかし、通常はCMakeの変数である cmake_cxx_compile_features をCMakeスクリプトで使用する必要はありません。その代わりに、どのC++規格の下でC++ファイルをコンパイルすべきかをCMakeに指示する方法が2つあります。 C++標準を明示的に指定するか、必要なC++機能を指定し、CMakeにC++標準を誘導させるかです。CMake は、C++ コンパイラーが正しいコマンドライン フラグ(例:-std=c++11)で呼び出されることを確認します。
1. C++ 標準を明示的に指定する
CMake のプロパティを設定することにより、C++ 標準を明示的に指定することができます。 CXX_STANDARD そして cxx_standard_required をCMakeターゲットに追加してください。
$ cat /tmp/src/CMakeLists.txt
project(foobar CXX)
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
add_executable(prog main.cc)
set_property(TARGET prog PROPERTY CXX_STANDARD 11)
set_property(TARGET prog PROPERTY CXX_STANDARD_REQUIRED ON)
$ cat /tmp/src/main.cc
int main() {
return 0;
}
$ mkdir /tmp/build
$ cd /tmp/build
$ cmake /tmp/src
-- The CXX compiler identification is GNU 4.8.2
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
$ make VERBOSE=1 | grep main.cc | grep -- "-c"
/usr/bin/c++ -std=gnu++11 -o CMakeFiles/prog.dir/main.cc.o -c /tmp/src/main.cc
$
2. 必要な C++ 機能を指定し、CMake に C++ 標準を誘導させる
CMakeコマンドを使用することができます。 ターゲット_コンパイル_フィーチャー で、CMake ターゲットで使用される C++ 機能を指定します。CMakeはこのリストから、使用するC++標準を決定します。CMakeのグローバルプロパティである cmake_cxx_known_features は、選択可能な C++ 機能をリストアップします。
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
message("Your CMake version supports these C++ features:")
get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
foreach(i ${known_features})
message("${i}")
endforeach()
例えば、このC++プログラムでは、ファイル名が main.cc は、C++11の機能を利用しています。 cxx_strong_enums。 , cxx_constexpr , cxx_auto_type
#include <cstdlib>
int main(int argc, char *argv[]) {
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
constexpr float a = 3.1415f;
auto b = a;
return EXIT_SUCCESS;
}
このCMakeLists.txtファイルは、これをビルドします。
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
set(needed_features
cxx_strong_enums
cxx_constexpr
cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] CMakeにおけるデバッグとリリースの比較
-
[解決済み] CMakeの出力をクリアするための'cmake clean'コマンドを探しています。
-
[解決済み】CMakeでC++ 11を有効にするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】CMakeでC++ 11を有効にするには?