33

C ++ 11でプロジェクトを作成したいのですが、ビルドシステムとしてCMakeを使用しています。

CMake構成ファイルに必要な最小コンパイラバージョンを追加するにはどうすればよいですか?

4

4 に答える 4

52

AFAIK、このようなものに対する組み込みのサポートはありませんが、あなたは確かにそれを自分で書くことができます:

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.gcc.version")
    message(FATAL_ERROR "Insufficient gcc version")
  endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.msvc.version")
    message(FATAL_ERROR "Insufficient msvc version")
  endif()
elseif(...)
# etc.
endif()

ただし、実際には、代わりに機能検出アプローチを検討することをお勧めします。つまりtry_compile()、コンパイラが必要な機能をサポートしていることを確認し、サポートしてFATAL_ERRORいない場合はを使用します。これはCMakeでより慣用的であり、そこにあるすべてのコンパイラーに適切な最小バージョンを見つける必要がないという追加の利点があります。

于 2013-02-18T10:51:03.987 に答える
25

CMake 2.8.10以降、ユーザーはCMAKE_ <LANG> _COMPILER_VERSION変数にアクセスして、コンパイラのバージョンを取得できます。以前のバージョンでは、これらは内部目的でのみ予約されており、ユーザーコードで読み取ることはできません。また、すべての言語に設定できるとは限りませんが、CとCXXは確実に使用できるはずです。

CMakeには、バージョン検証コードの記述に使用できるバージョン比較用の演算子(VERSION_LESS、VERSION_EQUAL、VERSION_GREATER)も含まれています。

最初に使用しているコンパイラを見つけてから、正しいバージョンを確認する必要があることを忘れないでください。

これが私のプロジェクトの1つからの短いサンプルです:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    # require at least gcc 4.8
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
        message(FATAL_ERROR "GCC version must be at least 4.8!")
    endif()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    # require at least clang 3.2
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2)
        message(FATAL_ERROR "Clang version must be at least 3.2!")
    endif()
else()
    message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.")
endif()
于 2013-08-22T00:29:18.037 に答える
9

特定のgccバージョンは次のように確認できます。

if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
    message(FATAL_ERROR "Require at least gcc-5.1")
endif()
于 2016-08-23T21:29:56.743 に答える
0

最近はサポートが組み込まれています。ドキュメントから:

target_compile_features(mylib PUBLIC cxx_std_11)

「この例では、CMakeは、コンパイラが少なくともC ++ 11(またはC ++ 14、C ++ 17、...)のモードで呼び出されるようにし-std=gnu++11、必要に応じてフラグを追加します。これは、内mylibのソースだけでなく、扶養家族(からのヘッダーが含まれる場合がありますmylib)。」

于 2022-01-14T15:36:56.577 に答える