Как использовать c++11 для программирования Arduino?
Как я могу использовать c++11
при программировании Arduino? Я был бы в порядке, используя либо Arduino IDE, либо другую среду. Меня больше всего интересуют улучшения основного языка, а не то, что требует стандартных изменений библиотеки.
5 ответов
по состоянию на версия 1.6.6, Arduino IDE включает c++11 по умолчанию.
для более старых версий, прочитать о:
очень легко изменить флаги для любого элемента toolchain,включая ассемблер, компилятор, линкер или архиватором.
протестировано на Arduino IDE версии 1.5.7 (выпущено на июль 2014 года),
- найти .txt ,
- AVR архитектура = > {путь установки}\оборудование\arduino\avr\платформа.txt
- архитектура SAM = > {путь установки}\оборудование\arduino\Sam\платформа.txt
- внутри этого файла, вы можете изменить любой флаг, например,
- компилятора.С. флаги для изменения компиляции флаги по умолчанию файлы c++.
- компилятора.СРР.флаги для изменения флагов компиляции по умолчанию для файлов C++.
- вы можете также изменить любой из "рецептов" или компиляции скороговорки, в соответствующем разделе файла конфигурации под заголовком"шаблоны компиляции AVR/SAM".
- после внесения изменений, вы необходимо перезапустить Arduino IDE, по крайней мере на версии 1.5.7.
например,
включить поддержку C++11 (C++0x), протестировано на Arduino IDE версии 1.5.7 и 1.5.8, вы просто добавите флаг "- std=gnu++11 " в конце строки, начинающейся с компилятора.СРР.флаги."=
ожидается, что C++11 включен по умолчанию в ближайшем будущем на Arduino IDE. Однако по состоянию на версию 1.5.8 (октябрь 2014) это все еще не так.
Arduino IDE 1.6.6 и новее имеют C++11 включен по умолчанию (они имеют флаг компилятора "-std=gnu++11", установленный в платформе.txt-файл.)
во-первых, только 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
is :
-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++.оригинальный.exe (или любое другое имя).
- создать avr-g++.ini-файл, где первая строка-полный путь к исходной программе (напр. D:\Arduino\hardware\tools\avr\bin\avr-g++.оригинальный.exe) и добавить дополнительные параметры, по одному на строку, по желанию.
ты молодец!
пример avr-g++.ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
надеюсь, что помогает!
Я использую Ино и это сработало:
ino build -cppflags="-std=c++0x"
это создало шестнадцатеричный файл размером не менее 15k (то есть с включенной оптимизацией), по сравнению с примерно 5k для стандартной сборки, что является соображением для бедного маленького Atmega328. Возможно, это подойдет для одного из микроконтроллеров с гораздо большим программным пространством.