CMake/C++ プロジェクトについて GCC または Clang のバージョンに併せた最新の -std オプションを与える CMake の記述例
例
-
cmake/flags.c++.std.cmake
などに保存しておき、 include
して使う:
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.5 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.5 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z" )
elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.2 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.2 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )
else()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
endif()
elseif( CMAKE_COMPILER_IS_GNUCXX )
if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 5.1 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14" )
elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.8)
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )
elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.7 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.7 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.3 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x" )
else()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03" )
endif()
endif()
効果
cmake/flags.c++.std.cmake
などに保存しておき、 include
して使う:if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.5 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.5 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z" )
elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.2 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.2 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )
else()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
endif()
elseif( CMAKE_COMPILER_IS_GNUCXX )
if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 5.1 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14" )
elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.8)
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )
elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.7 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.7 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.3 )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x" )
else()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03" )
endif()
endif()
例えばコンパイラーとして clang++-3.7
が与えられた場合には -std=c++1z
、 g++-4.9.2
が与えられた場合には -std=c++1y
など、コンパイラーに応じた使用可能な最新の -std
規格が翻訳オプションとして与えられる。
主な用途
- ソースコード側が最新の言語規格まで対応しているライブラリーについて、与えられたコンパイラーの対応規格レベルに応じて
-std
オプションを切り替えたい場合。
Reference
だそく
- MSVC++ 向けには何の効果も与えない効果があるので、 clang++, g++, cl.exe の何れでコンパイルする可能性があるプロジェクトで用いるなどしても MSVC++ で副作用が生じる事はない。
- MSVC++ 向けには何の効果も与えない効果があるので、 clang++, g++, cl.exe の何れでコンパイルする可能性があるプロジェクトで用いるなどしても MSVC++ で副作用が生じる事はない。
Author And Source
この問題について(CMake/C++ プロジェクトについて GCC または Clang のバージョンに併せた最新の -std オプションを与える CMake の記述例), 我々は、より多くの情報をここで見つけました https://qiita.com/usagi/items/a12d5bf08f4a7a13329d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .