web-dev-qa-db-ja.com

c ++ 11を使用してArduinoをプログラムする方法は?

どうすれば_c++11 Arduinoをプログラミングするとき? Arduino IDEまたは別の環境を使用しても構いません。標準ライブラリの変更を必要とするものではなく、コア言語の改善に最も興味があります。

51
walrii

バージョン1.6.6 の時点で、Arduino IDEはデフォルトでc ++ 11を有効にします。

古いバージョンについては、次をお読みください。

ツールチェーンの任意の要素のフラグを変更するのは非常に簡単です。アセンブラ、コンパイラ、リンカまたはアーカイバを含みます。

Arduino IDEバージョン1.5.7(2014年7月にリリース)、

  1. platform.txtファイル、を見つけます。
    • AVRアーキテクチャ=> {インストールパス}\hardware\arduino\avr\platform.txt
    • SAMアーキテクチャ=> {インストールパス}\hardware\arduino\sam\platform.txt
  2. そのファイル内では、任意のフラグを変更できます。たとえば、
    • compiler.c.flagsは、C++ファイルのデフォルトのコンパイルフラグを変更します。
    • compiler.cpp.flagsは、C++ファイルのデフォルトのコンパイルフラグを変更します。
  3. また、構成ファイルの対応するセクションで、タイトル「AVR/SAMコンパイルパターン」の下で、「レシピ」のいずれかを変更したり、パターンをコンパイルしたりできます
  4. 変更を行った後、少なくともバージョン1.5.7では Arduino IDE を再起動する必要があります。

例えば、

Arduino IDEバージョン1.5.7および1.5.8でテスト済み)でC++ 11(C++ 0x)のサポートを有効にするには、 compiler.cpp.flags = "で始まる行の最後にフラグ" -std = gnu ++ 11 "を追加するだけです。

Arduino IDEでは、C++ 11が近い将来デフォルトで有効になると予想されます。ただし、バージョン1.5.8(2014年10月)の時点ではまだそうではありません。

45

Arduino IDE 1.6.6以降では、デフォルトでC++ 11が有効になっています(platform.txtファイルでコンパイラフラグ "-std = gnu ++ 11"が設定されています)。

15
Capt

第一に、gcc 4.7以上(したがってavr-gcc 4.7以上)のみがC++11をサポートします。したがって、インストールされているバージョンを確認してください:

gcc --version
avr-gcc --version

avr-gccが4.7以上の場合、C++11を使用できる場合があります。

Arduino IDEはカスタムコンパイラフラグをサポートしていません。これは requested ですが、まだ実装されていません。

そのため、他の環境を使用するか、コマンドラインからプログラムを直接コンパイルする必要があります。

avr-gccを使用してコマンドラインから直接コンパイルする場合、C++ 11サポートを有効にするためのコンパイラフラグを追加するだけです。

-std=c++11

特定の 開発環境 の場合、ほとんどはIDE内のビルドオプションからコンパイラフラグの編集をサポートします。上記のフラグは、各環境のフラグのリストに追加する必要があります。


C++0xは、C++11標準の作業ドラフトの名前でした。 C++0xサポートはgcc 4.3以降で利用可能です。ただし、これは厳密に実験的なサポートであるため、C++11機能が存在することを実際に期待することはできません。 ここ は、対応するバージョンのgccで利用可能な機能の完全なリストです。 avr-gccで利用できる機能は、対応するgccバージョンで利用できるものと同じです。

C++0xのコンパイラフラグは次のとおりです。

-std=c++0x
14
asheeshr

私は Ino を使用し、これはうまくいきました:

ino build -cppflags="-std=c++0x"

これにより、標準のビルドの約5kに比べて、サイズが少なくとも15k(最適化がオンになっている)の16進ファイルが生成されました。これは、貧しい小さなAtmega328の考慮事項です。より多くのプログラムスペースを持つマイクロコントローラの1つで大丈夫かもしれません。

1
hoosierEE

Arduinoから追加のフラグを指定する簡単な方法はないことに注意してくださいIDEまたは他のIDE(Eclipse、コードブロックなど)またはコマンドライン。

ハックとして、小さなプロキシプログラムを使用できます(クロスプラットフォームである必要があります)。

//============================================================================
// Name        : gcc-proxy.cpp
// Copyright   : Use as you want
// Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
//============================================================================

#include <unistd.h>

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

int main(int argc, char *argv[]) {
    vector<string> arguments;
    vector<const char*> aptrs;

    // Additional options, one per line
    ifstream cfg((string(argv[0]) + ".ini").c_str());
    if (cfg.bad())
        cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;

    string arg;
    while (cfg) {
        getline(cfg, arg);
        if(arg == "\r" || arg == "\n")
            continue;
        arguments.Push_back(arg);
    }

    for (const string& arg : arguments)
        aptrs.Push_back(arg.c_str());

    for (int i = 1; i < argc; ++i)
        aptrs.Push_back(argv[i]);

    // Add null pointer at the end, execvp expects NULL as last element
    aptrs.Push_back(nullptr);

    // pass the vector's internal array to execvp
    const char **command = &aptrs[0];

    return execvp(command[0], command);
}
  1. プログラムをコンパイルします。
  2. 元のavr-g ++。exeの名前をavr-g ++。orig.exe(またはその他の名前)に変更します。
  3. 最初の行が元のプログラムへのフルパス(例:D:\ Arduino\hardware\tools\avr\bin\avr-g ++。orig.exe)であるavr-g ++。iniファイルを作成し、追加のパラメーターを1行に1つずつ追加します。望んだ通りに。

できました!

例avr-g ++。ini:

D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x

希望、それが役立ちます!

1
fAX