1. ホーム
  2. C++

c++11の機能を含むcmakeの書き方 (-std=c++11 cmakeList.txtに書き込む方法)

2022-02-10 23:50:07

g++ 4.8.2

cmake 2.8

以前、cmkaeがc++11の機能でコンパイルするために書いたコードには、こんな行がありました。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
しかし、常にcc1plus: error: unrecognized command line option "-std=c++11"エラーが発生します。
だから、set(QMAKE_CXXFLAGS "-std=c++11") とかは絶対にダメなんです。
後で知ったのですが、std=c++11 は古いバージョンではサポートされていないそうです。
OK
新しい書き込みを直接テストする場合。

<pre name="code" class="plain">#CMakeLists.txt
project(test)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
     message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()


c++11のコードをテストする

//test.cc
#include <iostream>
#include<vector>
using namespace std; 
int main()
{
    const std::vector<int> v(1);
    auto a = v[0];//a is of type int
        cout <<"a : "<< a <<endl;
    decltype(v[0]) b = 0;//b for const int& type, that is, std::vector<int>::operator[] (size_type) const return type
    auto c = 0;//c is int type
    auto d = c;//d is of type int
    decltype(c) e;//e is the type of int, the type of c entity
    decltype((c)) f = e;//f is int& type because (c) is the left value
    decltype(0) g;//g is of type int, because 0 is the right value
    return 0;
}





つまり、gccのバージョンによって、c++11のサポートを指定するフラグが異なる、つまり、古いバージョンでは-std=c++0xの書き方をサポートし、新しいバージョンでは-std=c++11の書き方を採用しているのです。上記のプログラムは、ローカルマシンでどの出力バージョンのg++を使用すべきかを判断するものです。

参考

http://stackoverflow.com/questions/10984442/how-to-detect-c11-support-of-a-compiler-with-cmake/20165220#20165220

http://stackoverflow.com/questions/20826135/passing-std-c11-to-cmakelists#