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#
関連
-
エラー: ローカル変数 'res' に関連付けられたスタックメモリのアドレスが返された
-
void* から char* への無効な変換」および「文字列定数から 'char*' への非推奨の変換」を解決 "
-
C++] error: 'const xxx' を 'this' 引数として渡すと修飾子が破棄される [-fpermissive] [C++] error: 'const xxx' を 'this' 引数として渡すと修飾子が破棄される。
-
const char*' から 'char*' への変換が無効です。
-
munmap_chunk():不正なポインタとSegmentation faultのバグを解決。
-
[C++】C++オーバーロード opeartor=非静的メンバ関数でなければならない?
-
C++共通ライブラリ関数一覧
-
ランタイムエラー: 'std::logic_error' のインスタンスを投げた後に terminate が呼び出されました。
-
std::allocator<char>::~allocator()' への未定義の参照
-
C++ inet_pton, inet_ntop 関数
最新
-
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++ std::string は NULL で初期化できない、基本的な使い方
-
C++ JSON ライブラリ jsoncpp 新 API の使用法 (CharReaderBuilder / StreamWriterBuilder)
-
C++-サンプリング関数 GridSampling (要サンプリング高速化)
-
C++ max() 関数エラー: 'max' の呼び出しに一致する関数がない
-
error: label 'xxxxxxx' [-fpermissive] にジャンプします。
-
警告:組み込み関数 'malloc' の互換性のない暗黙の宣言を修正する方法
-
C++: エラー C2228: '.str' の左側にはクラス/構造体/結合が必要
-
ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。
-
ベクトル添え字が範囲外のコンテナの使用、その他類似のエラー
-
c++は、ダブルフリーまたは破損(fasttop)が表示されます。