如何使用c++11
的编程Arduino的时候? 我想无论是使用Arduino的IDE或其他环境被罚款。 我最感兴趣的核心语言的改善,而不是要求标准库的变化的东西。
Answer 1:
随着1.6.6版本 ,Arduino的IDE默认启用的C ++ 11。
对于旧版本,请继续阅读:
这是很容易改变标志的工具链中的任何元素, 包括汇编器,编译器或归档。
测试在Arduino的IDE版本1.5.7(2014年7月发布)
- 找到platform.txt文件,
- AVR架构=> {安装路径} \硬件\ Arduino的\ AVR \ platform.txt
- SAM架构=> {安装路径} \硬件\ Arduino的\ SAM \ platform.txt
- 在这个文件中,你可以改变任何标志 ,例如,
- compiler.c.flags用于更改默认的编译选项为C ++文件。
- compiler.cpp.flags用于更改默认的编译选项为C ++文件。
- 您也可以将任何的“配方”或编译patters,在配置文件的相应部分,标题下的“AVR / SAM编译模式”。
- 进行更改之后, 必须重新启动Arduino的IDE,至少在1.5.7版本。
例如,
要启用C ++ 11(C ++ 0X),上的Arduino IDE版本1.5.7和1.5.8测试支持 ,则简单地在该行开始的末尾添加标志“-std = GNU ++ 11”与compiler.cpp.flags =”。
据预计,C ++ 11默认情况下, 在 Arduino的IDE 不久的将来实现。 然而,随着1.5.8版本(2014年10月),它仍然是情况并非如此。
Answer 2:
默认启用Arduino的IDE 1.6.6和较新的有C ++ 11(它们具有编译器标志“-std = GNU ++ 11”中的platform.txt文件中设置)。
Answer 3:
首先,只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
标准。 C++0x
支持是gcc
4.3起。 不过,严格来说这是实验性的支持,所以你不能指望realiably C++11
的功能存在。 这里是可用的相应版本功能的完整列表gcc
。 在功能的可用性avr-gcc
将是一样的,在相应的可用什么gcc
版本。
为编译器标志C++0x
是:
-std=c++0x
Answer 4:
请注意,有指定的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);
}
- 编译程序。
- 重命名原始AVR-G ++。EXE到AVR-G ++。orig.exe(或任何其他名称)。
- 创建AVR-克++ ini文件,其中第一线是将原始程序完整路径。(例如d:\的Arduino \硬件\工具\ AVR \ BIN \ AVR-克++ orig.exe)和添加额外的参数,每行一个,如预期的。
你完成了!
实施例AVR-克++,这样的:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
希望帮助!
Answer 5:
我用伊诺和这工作:
ino build -cppflags="-std=c++0x"
这产生一个十六进制文件大小至少为15K(即与优化开启),比5K左右为标准构建,这是一个可怜的小Atmega328考虑。 可能对于很多更程序空间的微控制器的一个是好的。