如何使用C ++ 11编程Arduino?
如何在编程Arduino时使用c++11
? 我会很好地使用Arduino IDE或其他环境。 我对核心语言改进最感兴趣,而不是需要标准库更改的东西。
从版本1.6.6开始 ,Arduino IDE默认启用c ++ 11。
对于旧版本,请阅读:
改变工具链的任何元素( 包括汇编器,编译器 ,链接器或归档器) 的标志是非常容易的 。
testing了Arduino IDE 1.5.7版(2014年7月发布),
- findplatform.txt文件,
- AVR体系结构=> {安装path} \硬件\ arduino \ avr \ platform.txt
- SAM体系结构=> {安装path} \ hardware \ arduino \ sam \ platform.txt
- 在那个文件里面,你可以改变任何标志 ,例如,
- compiler.c.flags用于更改C ++文件的默认编译标志。
- compiler.cpp.flags用于更改C ++文件的默认编译标志。
- 您也可以在configuration文件的对应部分,在标题“AVR / SAM编译模式”下更改任何“配方”或编译模式 。
- 进行更改后, 必须重新启动Arduino IDE ,至less在版本1.5.7上。
例如,
要启用对C ++ 11(C ++ 0x)的支持 ,在Arduino IDE 1.5.7和1.5.8版上进行testing,只需在行开始处添加标记“-std = gnu ++ 11”用compiler.cpp.flags =“。
预计在不久的将来 ,Arduino IDE将默认启用C ++ 11。 不过,截至2014年10月的版本1.5.8仍然不是这样。
Arduino IDE 1.6.6及更新版本默认启用了C ++ 11(它们在platform.txt文件中设置了编译器标志“-std = gnu ++ 11”)。
首先,只有gcc
4.7及以上版本(因此avr-gcc
4.7及以上)支持C++11
。 所以,检查安装的版本:
gcc --version avr-gcc --version
如果avr-gcc
是4.7或更高,那么你可以使用C++11
。
Arduino IDE不支持自定义编译器标志。 这已经被要求但尚未实施。
所以,你不得不使用其他环境,或直接从命令行编译你的程序。
如果使用avr-gcc
从命令行直接avr-gcc
,只需添加一个额外的编译器标志来启用C ++ 11支持。
-std=c++11
对于特定的开发环境 ,大多数都支持从IDE中的编译选项编辑编译器标志。 上面提到的标志需要被添加到每个环境的标志列表中。
C++0x
是C++11
标准的工作草案的名称。 C++0x
支持可用gcc
4.3以上。 但是,这是严格的实验性支持,所以您不能真正期望C++11
function出现。 以下是相应版本的gcc
的完整function列表。 avr-gcc
的function的可用性将与相应的gcc
版本中提供的function相同。
C++0x
的编译器标志是:
-std=c++0x
请注意,从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(或任何其他名称)。
- 创buildavr-g ++。ini文件,其中第一行是原始程序的完整path(例如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
希望,这有帮助!
我用Ino和这工作:
ino build -cppflags="-std=c++0x"
这产生了一个hex文件,至less有15K的大小(开启了优化),相比之下标准版本大约5K,这是一个可怜的小Atmega328的考虑。 对于具有更多程序空间的微控制器之一来说可能是可以的。