【问题标题】:How can I use a C++11 to program the Arduino?如何使用 C++11 对 Arduino 进行编程?
【发布时间】:2013-04-19 22:30:12
【问题描述】:

在 Arduino 编程时如何使用C++11

我可以使用 Arduino IDE 或其他环境。我最感兴趣的是核心语言的改进,而不是需要更改标准库的事情。

【问题讨论】:

    标签: c++ ide arduino firmware


    【解决方案1】:

    版本 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
    1. 在该文件中,您可以更改任何标志,例如,
    • compiler.c.flags 用于更改 C++ 文件的默认编译标志。
    • compiler.cpp.flags 用于更改 C++ 文件的默认编译标志。
    1. 您还可以更改任何“配方”或编译模式,在配置文件的相应部分,标题为“AVR/SAM 编译模式”。
    2. 进行更改后,您必须重新启动 Arduino IDE,至少在 1.5.7 版本上。

    例如,

    要启用对 C++11 (C++0x) 的支持,在 Arduino IDE 版本 1.5.7 和 1.5.8 上进行测试,您只需添加标志“-std=gnu+ +11" 在以 compiler.cpp.flags=".

    开头的行的末尾

    预计在不久的将来会在 Arduino IDE 上默认启用 C++11。在不久的将来。但是,从 1.5.8 版(2014 年 10 月)开始,情况仍然不是这样。

    【讨论】:

    【解决方案2】:

    Arduino IDE 1.6.6 及更高版本默认启用 C++11(它们在 platform.txt 文件中设置了编译器标志“-std=gnu++11”)。

    【讨论】:

      【解决方案3】:

      首先,只有 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
      

      对于特定的development environments,大多数支持从 IDE 中的构建选项编辑编译器标志。上述标志需要添加到每个环境的标志列表中。


      C++0x 是 C++11 标准工作草案的名称。 GCC 4.3 及更高版本提供 C++0x 支持。但是,这是严格的实验性支持,因此您不能可靠地期望 C++11 功能存在。 Here 是相应版本的 GCC 可用功能的完整列表。 AVR-GCC 中的功能可用性将与相应 GCC 版本中的功能相同。

      C++0x 的编译器标志是:

      -std=c++0x
      

      【讨论】:

      • 你能用 C++0x 吗?我知道它有点拗口,但直到最近它还是标准的名称,而且它看起来更好 IMO。
      • 这曾经是最好的答案(谢谢)。但是对于新的 IDE 版本,更新的答案会更好。
      【解决方案4】:

      请注意,没有简单的方法可以从 Arduino IDE 指定其他标志或使用其他 IDE(EclipseCode::Blocks 等)或命令行。

      作为一个hack,你可以使用一个小的代理程序(应该是跨平台的):

      //============================================================================
      // 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. 创建 avr-g++.ini 文件,其中第一行是原始程序的完整路径(例如 D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe)并添加其他参数,一个每行,根据需要。

      你已经完成了!

      示例avr-g++.ini

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

      【讨论】:

      • 我收到评论,在我的 IDE 中找不到该文件。
      • 对不起,我没有监控这个问题。如果仍然相关,请告诉我。谢谢!
      【解决方案5】:

      我使用Ino,这很有效:

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

      这生成了一个大小至少为 15k 的 hex 文件(即启用了优化),而标准构建的大小约为 5k,这是一个可怜的小 ATmega328 的考虑因素。对于具有更多程序空间的微控制器之一来说可能没问题。

      【讨论】:

        【解决方案6】:

        如果您需要更多控制和更好的 IDE,我建议您使用 Sloeber Plugin for Eclipse 或 Sloeber IDE 本身。

        使用此 IDE 创建更复杂的代码要容易得多。它还允许向编译器(C、C++ 和链接器)添加标志。因此,要自定义编译,只需右键单击项目并选择 Properties。在 Properties 窗口中,选择 Arduino → Compiler 选项。这样您就可以在构建中添加选项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-30
          • 2020-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-25
          • 1970-01-01
          相关资源
          最近更新 更多