57

对 Arduino 进行编程时如何使用C++11 ?

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

4

6 回答 6

52

版本 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 月)开始,情况仍然并非如此。

于 2014-10-03T08:21:37.157 回答
16

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

于 2015-11-15T09:05:56.417 回答
14

首先,只有 GCC 4.7 及更高版本(因此 AVR-GCC 4.7 及更高版本)支持 C++11。因此,检查安装的版本:

gcc --version
avr-gcc --version

如果 AVR-GCC 是 4.7 或更高版本,那么您也许可以使用 C++11。

Arduino IDE 不支持自定义编译器标志。这已被请求,但尚未实施。

因此,您不得不使用其他环境或直接从命令行编译程序。

如果使用 AVR-GCC 直接从命令行编译,您只需添加一个额外的编译器标志即可启用 C++11 支持。

-std=c++11

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


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

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

-std=c++0x
于 2013-04-12T16:56:03.177 回答
1

请注意,没有简单的方法可以从 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
于 2014-02-01T23:53:46.983 回答
1

我使用Ino,这很有效:

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

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

于 2014-07-02T15:13:49.063 回答
-1

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

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

于 2020-11-02T12:35:33.483 回答