Eclipse CDTでC ++ 11 / C ++ 0xサポートを有効にする方法は?


210

Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2

これは、C ++ 11コードの一部の例です。

auto text = std::unique_ptr<char[]>(new char[len]);

Eclipseエディターは以下について不満を述べています。

Function 'unique_ptr' could not be resolved

Makefileコンパイルは正常に動作します。Eclipseがこれらの種類のエラーについて文句を言うのをやめるには?


12
最低でも、それはstd::unique_ptr<char[]>
カビ

それが正しいかわかりません-char []はchar *に変換可能で、unique_ptr <char>はchar *のようなcharへのポインタです
Nick

1
思いませんunique_ptr<char>呼び出すdeleteことがで作成されたので、間違っていますか、new[]
ディートリッヒエップ

6
@ニック:いいえ、彼は正しいです。あなたがそれを書いた方法deleteは、あなた delete[]呼ばれる必要があるときに呼ばれるようになります。unique_ptr<char>それがで削除されるポインタを、なってきていることを前提としていdelete。正しくunique_ptr<char[]>削除される配列が必要delete[]です。
Nicol Bolas

回答:


224

私はEclipseフォーラムでこの記事を見つけました。これらの手順を実行しただけで、うまくいきました。CygwinセットアップのWindowsでEclipse Indigo 20110615-0604を使用しています。

  • 新しいC ++プロジェクトを作成する
  • すべてのデフォルトオプション
  • 作成したら、プロジェクトを右クリックして[プロパティ]に移動します
  • C / C ++ビルド->設定->ツール設定-> GCC C ++コンパイラ->その他->その他のフラグ。Put -std=c++0x(または新しいコンパイラバージョンの場合)-std=c++11最後のは... GCC C ++コンパイラの代わりにCygwinコンパイラも使用する
  • C / C ++全般->パスとシンボル->シンボル-> GNU C ++。「追加...」をクリック__GXX_EXPERIMENTAL_CXX0X__し、「名前」に貼り付け(必ず2つのアンダースコアを追加し、先頭に追加)、「値」を空白のままにします。
  • [適用]をクリックして、要求されたすべてを実行してから、[OK]をクリックします。

Eclipse FAQにもこれに関する説明があります:Eclipse FAQ / C ++ 11 Features

Eclipseイメージ設定


2
よかった!ただし、必ずGXX_EXPERIMENTAL_CXX0Xに2つのアンダースコアを追加して追加してください。当面はこれを受け入れます
Nick

5
これにより、誤ったエディターエラーが削除されましたか?コンパイルに問題はなく、新しいstd型は認識されますが、範囲ベースのforループと右辺値参照のエディター構文エラーを取り除くことはできません&&
-juanchopanza

7
自然なフォローアップの質問は次のようになります。これらの特定のC ++プロジェクト設定を新しいEclipseプロジェクトテンプレートに「C ++ 11プロジェクト」と保存することでワークフローを最適化できますか?
Nordlöw

38
注:Junoの答えを探している人にとっては、これは機能しません
クリストファー

4
ケプラー/ジュノの場合、解決策はこの回答にあります。下記のJohan Lundbergの返信の編集に投稿されていますが、ここでも同様に、承認された回答をより完全なものにするために注意します。
できないLumière、2013

150

Eclipse CDT 4.4 Lunaおよび4.5 Marsの手順

まず、プロジェクトを作成する前に、Eclipse構文パーサーを構成します。

Window-> Preferences-> C/C++-> Build-> Settings-> Discovery->CDT GCC Build-in Compiler Settings

Command to get compiler specs追加」というタイトルのテキストボックス内-std=c++11

これでプロジェクトを作成できます。構成は、作成したプロジェクトの種類によって異なります。

次のように作成されたプロジェクトの場合:ファイル->新規->プロジェクト-> C / C ++-> C ++プロジェクト

作成したプロジェクトを右クリックして開きます

Properties-> C/C++ Build-> Settings-> Tool Settings-> GCC C++ Compiler->Dialect

置く-std=c++11と題したテキストボックスにother dialect flagsまたは選択ISO C++11からLanguage standardドロップダウン。

CMakeプロジェクトの場合

(プロジェクト内の)Eclipseプロジェクトファイルを生成する

mkdir build
cd build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ..

次に、生成されたディレクトリを標準のEclipseプロジェクトとしてEclipseにインポートします。プロジェクトを右クリックして開きます

Properties-> C/C++ General-> Preprocessor Include Paths, Marcos etc.->Providers

有効にCDT GCC Build-in Compiler Settingsしてそれより上に移動しますContributed PathEntry Containers(これは重要です)

最後の共通ステップ

再コンパイル、再生成Project-> C/C++ IndexそしてEclipseを再起動します。


1
日食の再起動を必要とせずに完全に動作しました。ありがとうございました。
プラサナク2015

ありがとうございました。ルナでも他の答えは私には役に立ちませんでした。
モハメドエルナキブ2015年

火星でも動作します。すばらしい答え以上です!この回答に2度しか投票できない場合は、
モハメドエルナキブ2015

ありがとう!これは、私が遭遇した問題(4.5)
AturSams

2
Eclipse Neon.3の場合、C ++ Makefileプロジェクトでは、追加-std=c++11するプロジェクト設定はでしたProject Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers [tab] -> CDT GCC Built-in Compiler Settings -> Command used to get compiler specs:。それにあなた-std=c++11を追加します。提案どおりにグローバルワークスペース設定で設定しましたが、新しいMakefileプロジェクトを作成したときに、上記の場所にコピーされませんでした。
BeeOnRope

112

2016年更新:

以下のようGCC 6変更)、デフォルトC ++ダイアレクトはC ++ 14です。つまり、明示的に新しいまたは古い方言が必要でない限り、Eclipseを使用して何かを行う必要はありません。

ルナと火星のために

このコミュニティWikiセクションには、Trismegistosによる回答が組み込まれています。

1.プロジェクトを作成する前に、Eclipse構文パーサーを構成します。

ウィンドウ->設定-> C / C ++->ビルド->設定->ディスカバリー-> CDT GCCビルドインコンパイラ設定

コンパイラー仕様を取得するためのコマンドというタイトルのテキストボックスに追加2.プロジェクトを作成します-std=c++14 。構成は、作成したプロジェクトの種類によって異なります。

次のように作成されたプロジェクトの場合:ファイル->新規->プロジェクト-> C / C ++-> C ++プロジェクト

作成したプロジェクトを右クリックして開きます

プロパティ-> C / C ++ビルド->設定->ツール設定-> GCC C ++コンパイラ->方言

-std=c++14他の方言フラグが付いたテキストボックスに入力するか、[言語標準]ドロップダウンから[ISO C ++ 11]を選択します。

GXX_EXPERIMENTALハックなしでこれを解決する新しい方法があります。

最新バージョン:(現在JunoとKepler Luna):

Junoの新しいバージョンでは、設定は次の場所にあります Project properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> tab Providers -> CDT GCC Builtin Compiler Settings ()

古いバージョン2012/2013:

  1. C / C ++ビルド(プロジェクト設定)で、プリプロセッサインクルードパスを見つけ、[ プロバイダ]タブに移動します。CDT GCC Builtin Compiler Settings以外のすべての選択を解除します。次に、共有設定エントリのタグを解除します…。オプション-std = c ++ 11をCommandというテキストボックスに追加して、コンパイラの仕様を取得します。

  2. パスとシンボルに移動します。[シンボル]で、[ デフォルト戻す ]をクリックして適用します。


ノート:

Eclipseは、applyを押すことにこだわり、設定タブを離れるたびに実行する必要があります。

【自己宣伝】:上記を踏まえて、より詳細な説明を独自に書きました。 http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

ユーザーのおかげNobodyhttps://stackoverflow.com/a/13635080/1149664


3
ありがとうございましたが、c ++ 11参照の解決には役立ちませんでした。プログラムは正しくコンパイルされますが、Eclipseはそれらを解決できません。「配列」をチェックすると、#ifndef __GXX_EXPERIMENTAL_CXX0X__trueが返され、その下のコードは解析されません。__GXX_EXPERIMENTAL_CXX0X__プロジェクトシンボルに追加すると、配列は解決されますが、プロジェクトの参照がめちゃくちゃになります。ここの問題は何でしょうか?
Halil Kaskavalci

1
バグだと思います。私はそれを次のように再現しました:新しいプロジェクトを開きます。c ++ 11機能を有効にします。パブリック変数を使用してランダムクラスを追加します。このランダムクラスのベクトルを作成します。イテレータを取得します。パブリック変数にアクセスしてみてください。ワークスペースが破損しているか、Eclipseにこれを解析できないバグがあります。
Halil Kaskavalci

1
@HalilKaskavalci私はこれと同じバグを見つけました。エディターをc ++ 11用に設定した場合、イテレーターを解決できません。そうしないと、std :: unique_ptrで解決できません。私は両方を使用しているので、本当に迷惑です。
Kian

1
@Kianバグを報告しました。bugs.eclipse.org/bugs/show_bug.cgi?id=397027。それは非常に迷惑で、ブーストライブラリを使い始めましたが、エラーは発生しません:)
Halil Kaskavalci

1
私のために働く!ありがとうございました!(参考にしてください)プロバイダーに-std = c ++ 11を追加し、シンボルのデフォルトを復元しました。シンボルをデフォルトに戻すことで節約できると思います。今度はunique_ptrを解決しています。
Denis Zaikin 2014年

20

最新の(Juno)eclipse cdtでは、次のように動作し__GXX_EXPERIMENTAL_CXX0X__ました。自分で宣言する必要はありません。これは、CDTインデクサーとコンパイラーのパラメーターとして機能します。

「プロジェクト名」->右クリック->プロパティ:

C / C ++全般->プリプロセッサインクルードパス、マクロなど->「プロバイダー」という名前のタブに切り替えます。

  • 「構成」で「リリース」を選択します(その後「デバッグ」)

  • すべてのプロバイダーをオフにして、「CDT GCC Built-in Compiler Settings」を選択するだけです

  • 「プロジェクト間で設定エントリを共有する(グローバルプロバイダー)」のチェックを外します

  • 「コンパイラー仕様を取得するコマンド:」に、引用符なしで「-std = c ++ 11」を追加します(引用符でも機能する場合があります)。

  • 適用をクリックしてオプションを閉じます

  • インデックスを再構築する

これで、c ++ 11に関連するすべてのものがインデクサーによって正しく解決されるはずです。

win7 x64、sourceforgeのmingwbuildsプロジェクトからのcdt mingw-w64 gcc 4.7.2を使用した最新の公式日食


Type 'std :: thread'のように、同じエラーのエディター警告が引き続き表示されますが、コンパイルして実行しても問題は解決しませんでした
Scott Stensland

2
u新しい設定で1回コンパイルする必要があるため、パーサーはstd = c ++ 11フラグが設定されていることを「学習」します
Andreas

コンパイラのバージョンによっては、-std = c ++ 11の代わりに-std = c ++ 0xを追加する必要がある場合があります(たとえば、debian wheezy)
xmoex

15

私のEclipse Junoでも同じ問題がありました。これらのステップは問題を解決しました:

  • に移動しProject -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols]ます。
  • シンボル追加:__cplusplus値を201103L

2
Makefileプロジェクトでも機能するため、これは受け入れられるべき答えです!
omikron 14

@ Jerk31これは、Windowsで実行されているEclipse Junoでは機能しません(私にとって)。バイナリが正常に機能しているにもかかわらず、不必要なエラーが表示されます。私を助けてください!!!
15年

私はWindowsであなたを助けることができなくて本当に申し訳ありません。このOSでC ++プロジェクトを実行する機会がありません。幸運を祈ります!
ジェローム

13

Eclipse CDT Keplerの場合、std::thread未解決のシンボルを取り除くために私が働いたのは次のとおりです。

  1. Preferences-> C / C ++-> Build-> Settingsに移動します

  2. [検出]タブを選択します

  3. CDT GCC組み込みコンパイラ設定を選択します[共有]

  4. -std = c ++ 11を「コンパイラー仕様を取得するコマンド:」フィールドに追加します。

$ {コマンド} -E -P -v -dD -std = c ++ 11 $ {入力}

  1. OK、プロジェクトのインデックスを再構築します。

-std=c++11プロジェクトにProperties/C/C++ Build->Settings->Tool Settings->GCC C++ Compiler->Miscellaneous->Other フラグを追加するだけではKeplerには不十分でしたが、Heliosなどの古いバージョンでは十分でした。


Eclipseバージョンの場合:2019-09R。このソリューションは私にとってはうまくいきましたが、その前に多くの時間を費やしてきました。問題はビルダー設定にありました:プロジェクト->プロパティ-> C / C ++ビルド:[ビルダー設定]タブで[ビルダータイプ]に[内部ビルダー]を選択します。
grekhss

5

私はまだコメントできないので、自分の答えを書いています:

それはに関連しています __GXX_EXPERIMENTAL_CXX0X__、Eclipse JunoおよびCDT 8.xにおり、有効です。

この回答の一部はすでに他の回答でカバーされていますが、一貫性を持たせたいと思います。

stdc ++ 11を使用してビルドできるようにするには、コンパイラーに特定のフラグを追加する必要があります。プロジェクトのプロパティを介してそれを行うことができます。プロジェクトのプロパティを変更するにはRMBProject propertiesまたはALT + ENTER。次に、C / C ++ビルド->設定->ツール設定-> GCC C ++コンパイラ->その他->その他のフラグ。行の最後に-std = c ++ 11を置きます。GCCの場合は次のようになります-c -fmessage-length=0 -std=c++11。-stdc ++ 11フラグを追加すると、コンパイラー(GCC)が__GXX_EXPERIMENTAL_CXX0X__それ自体で宣言します。

この時点で、C ++ 11の優れた機能をすべて使用してプロジェクトをビルドできます。

問題は、Eclipseがエラーをチェックする独自のパーサーを備えていることです。そのため、Eclipseエディターで厄介なエラーがすべて表示されると同時に、何もせずにプロジェクトをビルドして実行できます。明示的に宣言して[適用]をクリックし、[エントリ]タブに戻ることにより、この問題を解決する方法があります。GNUC ++で、CDT管理ビルド設定エントリが存在するかどうかを確認します。この時点で大丈夫です。__GXX_EXPERIMENTAL_CXX0X__プロジェクトのフラグをそれを行うことができます(Carsten Greinerが言ったように):C / C ++ General-> Paths and Symbols-> Symbols-> GNU C ++。[追加...]をクリックし、[ __GXX_EXPERIMENTAL_CXX0X__名前]に過去(2つのアンダースコアを追加して先頭に追加)を入力し、[値]を空白のままにします。そして今、私が最初の答えにコメントでカバーしたい追加の部分です、C / C ++ General-> Preprocessor Include Path Macrosなどに行きます->プロバイダー、そして選択CDT Managed Build Setting Entries__GXX_EXPERIMENTAL_CXX0X__


3

私にもいくつかの問題がありました(Ubuntu 13.04 64ビット、g ++-4.8、eclipse Juno 3.8.1、CDT 6.0.0)。上記で説明したことはたくさんありますが、申し訳ありませんが、さらに

std::thread

c ++ 11の一部として(リンカーに-pthreadを追加すると、この問題が解決されます)。とにかく、最後にこれらの設定はうまくいきました:

プロジェクト->プロパティ-> C / C ++ビルド->設定->その他。追加

-std=c++11

GCCおよびG ++コンパイラのフラグ。「適用」をクリックします。

リンカーの場合、同じウィンドウ、その他、リンカーフラグに、

-pthread

国旗。共有ライブラリ設定、共有オブジェクト名、追加

-Wl,--no-as-needed

フラグも。「適用」をクリックします。

C / C ++全般->パスとシンボル->シンボルTAB、GNU C ++を選択、追加

__GXX_EXPERIMENTAL_CXX0X__

(値なし)

国旗。「適用」をクリックします。

C / C ++一般->プリプロセッサインクルードパス..-> [プロバイダ]タブ:チェック

CDT GCC組み込みコンパイラ設定

「コンパイラー仕様を取得するコマンド」の場合は、

-std=c++11

国旗。[共有]をオフにします。「適用」をクリックします。

CDT Managagesビルド設定エントリ、これもチェックしてください。他の2つのチェックを外します。「適用」をクリックします。

[エントリ]タブ、GNU C ++ CDT Managagesビルド設定エントリに戻ると、追加された

__GXX_EXPERIMENTAL_CXX0X__

エントリ。

それでおしまい。コーディング時に入力

std::

たとえば、スレッドクラスをオートコンプリートできるようになりました。ビルドは正常に機能し、

std::system_error'what(): Enable multithreading to use std::thread: Operation not permitted

実行時。


それはProject -> Properties -> C/C++ Build -> Settings -> Miscellaneous私のために働いたステップでした。たくさんありがとう:D
Jake88

2

私だけかどうかはわかりませんが、最高ランクのソリューションが機能しません。私のEclipseバージョンは、Ubuntuでsudo apt-get install eclipseを使用してインストールされた通常のEclipseプラットフォームですが、方法を一緒に採用するソリューションを見つけました最高ランクのソリューションと2番目のソリューションの両方から、それを機能させるために私がしたことは以下のように説明されます(C ++プロジェクトの作成などの他のステップは簡単にするために無視されます)

C ++プロジェクトを作成したら

(1)C / C ++ General-> Paths and Symbols-> Symbols-> GNU C ++。[追加...]をクリックし、GXX_EXPERIMENTAL_CXX0X必ず 2つのアンダースコアを追加して追加)を[名前]に貼り付け、[ 値]を空白のままにします。

(2)C / C ++ビルド(プロジェクト設定)で、プリプロセッサインクルードパスを見つけ、[プロバイダ]タブに移動します。CDT GCC Builtin Compiler Settings以外のすべての選択を解除します。次に、共有設定エントリのタグを解除します…。オプション-std = c ++ 11をCommandというテキストボックスに追加して、コンパイラの仕様を取得します。

上記の2および2のみの手順を実行した後、それは機能し、eclipseはunique_ptrを解決できます。このソリューションが機能する理由がわかりません。それが人々の役に立つことを願っています。


これも私のために働いた(日食ネオン)。最初は他のプロバイダーの選択を解除しませんでしたが、それでも問題が発生しましたが、「CDT GCC Built-in Compiler Settings」および「CDT User Settings」以外のプロバイダーの選択をすべて解除すると機能しました。ありがとう!
zpon

2

std::unique_ptrファイルにC ++ 11メモリヘッダーを含めても、Eclipse C / C ++はシンボルを認識しません。

あなたがGNU C ++コンパイラを使用していると仮定すると、これは私が修正するためにしたことです:

プロジェクト->プロパティ-> C / C ++全般->プリプロセッサインクルードパス-> GNU C ++-> CDTユーザー設定エントリ

  1. 「追加...」ボタンをクリックします

  2. ドロップダウンメニューから[プリプロセッサマクロ]を選択します

    Name: __cplusplus     Value:  201103L
  3. [適用]をクリックし、次に[OK]をクリックしてプロジェクトに戻ります

  4. 次に、C ++インデックスを再構築します。プロジェクト-> C / C ++インデックス->再構築


これは、Eclipse 2018-12で私のために機能した唯一の方法です。「受け入れられた」回答などは、2018-12で機能しなくなりました。
David Steinhauer

1

私はEclipse Neonで私は上記のTrismegistosの回答に従いましたが、それでも私は追加のステップを追加しました:

  • プロジェクトに移動します->プロパティ-> C ++全般->プリプロセッサインクルードパス、マクロなど->プロバイダー-> CDTクロスGCC組み込みコンパイラ設定、フラグ「-std = c ++ 11」を追加

適用してOKを押します。

乾杯、

男。


0
  • プロジェクトを右クリックして、[プロパティ]に移動します
  • C / C ++ビルド->設定->ツール設定-> GCC C ++コンパイラ->その他->その他のフラグ。他のフラグテキストボックスの最後に-lmを入力して、[OK]をクリックします。

これはEclipseのどのバージョンですか?
Braiam 2013

0

ハックもクリーナーバージョンもIndigoでは機能しません。ハッキングは無視され、必要な構成オプションが欠落しています。明らかな理由もなく、ビルドが機能しなくなった後、機能し始めた理由は何もありません。少なくともコマンドラインからは、再現可能な結果が得られます。


0

Eclipse LunaでC ++ 14のサポートを取得するには、次の手順を実行します。

  • C++ General -> Preprocessor Include -> Providers -> CDT Cross GCC Built-in Compiler Settings"-std = C ++ 14"を追加します
  • C++ Build -> Settings -> Cross G++ Compiler -> Miscellaneous"-std = C ++ 14"を追加します

プロジェクトのインデックスを再作成し、最終的にEclipseを再起動します。期待どおりに動作するはずです。


0

Macでこのように解決しました。Homebrewを使用して最新バージョンのgcc / g ++をインストールしました。これらは/ usr / local / binにあり、/ usr / local / includeにインクルードされています。

私は/ usr / local / binにCDを挿入し、g ++ @ 7からのシンボリックリンクをg ++だけに作成したため、@ビットは煩わしいものになりました。

次に、MyProject->プロパティ-> C / C ++ビルド->設定-> GCC C ++コンパイラに移動し、コマンドを「g ++」から「/ usr / local / bin / g ++」に変更しました。シンボリックリンクを作成しない場合は、より具体的にすることができます。

リンカについても同じことを行います。

適用して適用して閉じる。インデックスを再構築します。しばらくの間、それは困難な数のエラーを示しましたが、それはインデックスを構築している間だったと思います。私がエラーを理解している間、それらはすべて、それ以上のアクションなしで消えました。


検証せずに、Eclipse-> Properties-> C / C ++-> Core Build Toolchainsに移動して、異なるパスで編集することもできると思いますが、どうなるかわかりません。


0

std :: optionalとstd :: swapを使用するCとC ++の混合プロジェクトでEclipse C ++ 2019-03を使用して同様の問題が発生しました。私のために働いたのはこれでした。プロジェクトのプロパティ-> C / C ++ビルド->設定->ツール設定->クロスG ++コンパイラで、-std = gnu ++ 17をその他から削除し、代わりにDialect-> Other Dialect Flagsに配置します。


0

クロスコンパイラーを使用すると、同僚が細心の注意を払って作成した高度なカスタムビルドシステムがよく使用されます。「既存のコードを使用したメイクファイルプロジェクト」を使用しているため、他のほとんどの回答は該当しません。

プロジェクトの開始時に、「既存のコードを使用したメイクファイルプロジェクト」のウィザードでクロスコンパイラを使用していることを指定する必要があります。厄介なのは、過去10年ほどの間、そのウィザードのクロスコンパイラボタンがクロスコンパイラの場所を要求しないことです。したがって、C ++の問題とクロスコンパイラの問題を修正する手順で、上記の@ravwojdylaなどの回答で述べたように、プロバイダータブに移動する必要がありますが、選択する必要があるプロバイダーはクロスコンパイラプロバイダーです。次に、コマンドボックスにコンパイラへの完全なパスを入力し、サポートしたいC ++標準に-std = gnu ++ 11を追加します。これは期待どおりに機能します。

既存のプロジェクトに対してこれを行うことができます。必要なのは、インデクサーを再実行することだけです。

実験的なフラグを追加したり、__​​ cplusplusの定義をオーバーライドしたりする必要はありませんでした。唯一のことは、最新のCコードが大量にある場合、C固有の標準オプションを配置する場所がないことです。

そして、物事が本当にうまくいかない場合、インデクサーサブメニューのコマンドを使用してパーサーログを取得することは、非常に有益です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.