Làm cách nào để sử dụng c++11
khi lập trình Arduino? Tôi sẽ sử dụng Arduino IDE hoặc môi trường khác. Tôi quan tâm nhất đến các cải tiến ngôn ngữ cốt lõi, không phải những thứ yêu cầu thay đổi thư viện chuẩn.Làm thế nào để sử dụng C++ 11 để lập trình Arduino?
Trả lời
Kể từ phiên bản 1.6.6, Arduino IDE bật C++ 11 theo mặc định.
Đối với phiên bản cũ, hãy đọc tiếp:
Nó là rất dễ dàng để thay đổi cờ cho bất kỳ yếu tố của toolchain, bao gồm lắp ráp, trình biên dịch, mối liên kết hoặc Archiver.
Thử nghiệm trên phiên bản Arduino IDE 1.5.7 (phát hành vào tháng 7 năm 2014),
- Xác định vị trí platform.txt tập tin,
- AVR kiến trúc => {cài đặt path} \ phần cứng \ arduino \ avr \ platform.txt
- Kiến trúc SAM => {install path} \ hardware \ arduino \ sam \ platform.txt
- Bên trong tệp đó, bạn có thể thay đổi cờ bất kỳ, ví dụ:
- compiler.c.flags để thay đổi cờ biên dịch mặc định cho tệp C++.
- compiler.cpp.flags để thay đổi cờ biên dịch mặc định cho các tệp C++.
- Bạn cũng có thể thay đổi bất kỳ của "công thức" hoặc biên dịch patters, tại phần tương ứng của tập tin cấu hình, dưới tiêu đề "AVR/SAM lập mô hình".
- Sau khi thực hiện các thay đổi, bạn phải khởi động lại Arduino IDE, ít nhất là trên phiên bản 1.5.7.
Ví dụ,
Để kích hoạt hỗ trợ cho C++ 11 (C++ 0x), thử nghiệm trên phiên bản Arduino IDE 1.5.7 và 1.5.8, bạn sẽ chỉ cần thêm cờ "-std = gnu ++ 11" ở cuối dòng bắt đầu với compiler.cpp.flags =".
người ta cho rằng C++ 11 được kích hoạt theo mặc định trong tương lai gần trên IDE Arduino Tuy nhiên, kể từ phiên bản 1.5.8 (tháng 10 năm 2014) nó vẫn không trường hợp.
Thứ nhất, chỉ gcc
4.7 trở lên (và do đó avr-gcc
4.7 trở lên) hỗ trợ C++11
. Vì vậy, kiểm tra các phiên bản cài đặt với:
gcc --version
avr-gcc --version
Nếu avr-gcc
là 4.7 hoặc cao hơn, sau đó bạn có thể sử dụng C++11
.
Arduino IDE không hỗ trợ cờ trình biên dịch tùy chỉnh. Đây là requested nhưng chưa được triển khai.
Vì vậy, bạn còn lại phải sử dụng các môi trường khác hoặc để biên dịch chương trình của mình trực tiếp từ dòng lệnh.
Trong trường hợp biên dịch trực tiếp từ dòng lệnh bằng cách sử dụng avr-gcc
, bạn chỉ cần thêm cờ trình biên dịch bổ sung để bật hỗ trợ C++ 11.
-std=c++11
Để cụ thể development environments, hầu hết sẽ hỗ trợ chỉnh sửa cờ trình biên dịch từ tùy chọn xây dựng trong IDE. Cờ được đề cập ở trên cần được thêm vào danh sách cờ cho từng môi trường.
C++0x
là tên bản nháp làm việc theo tiêu chuẩn C++11
. Hỗ trợ C++0x
có sẵn gcc
4.3 trở đi. Tuy nhiên, đây là hỗ trợ thử nghiệm nghiêm ngặt, do đó bạn không thể mong đợi một cách thực tế các tính năng của C++11
. Here là danh sách đầy đủ các tính năng có sẵn với phiên bản tương ứng của gcc
. Tính khả dụng của các tính năng trong avr-gcc
sẽ giống với các tính năng có sẵn trong phiên bản gcc
tương ứng.
Trình biên dịch cờ cho C++0x
là:
-std=c++0x
Bạn có thể sử dụng C++ 0x không? Tôi biết đó là một chút của một mouthful, nhưng nó _was_ tên của tiêu chuẩn cho đến gần đây, và nó trông IMO đẹp hơn nhiều. – Polar
@Polar Đã cập nhật. – asheeshr
Đây từng là câu trả lời hay nhất (cảm ơn). Nhưng với các bản phát hành IDE mới, một câu trả lời mới hơn sẽ tốt hơn. – walrii
Xin vui lòng, lưu ý, rằng không có cách nào dễ dàng để xác định cờ bổ sung từ Arduino IDE hoặc sử dụng IDE khác (Eclipse, Mã khối, vv) hoặc dòng lệnh .
Là một hack, bạn có thể sử dụng một chương trình proxy nhỏ (nên được cross-platform):
//============================================================================
// 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);
}
- Biên dịch chương trình.
- Đổi tên bản gốc avr-g ++. Exe thành avr-g ++. Orig.exe (hoặc bất kỳ tên nào khác).
- Tạo tệp avr-g ++. Ini trong đó dòng đầu tiên là đường dẫn ĐẦY ĐỦ đến chương trình gốc (ví dụ: D: \ Arduino \ phần cứng \ công cụ \ avr \ bin \ avr-g ++. Orig.exe) và thêm thông số bổ sung, một trên mỗi dòng, như mong muốn.
Bạn đã hoàn tất!
Ví dụ avr-g ++.ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
Hy vọng, điều đó sẽ hữu ích!
tôi sử dụng Ino và điều này đã làm việc:
ino build -cppflags="-std=c++0x"
này tạo ra một tập tin hex ít nhất 15k kích thước (đó là với tối ưu hóa bật), so với khoảng 5k cho các tiêu chuẩn xây dựng, mà là một xem xét cho một Atmega328 ít người nghèo. Có thể không sao đối với một trong những vi điều khiển có nhiều không gian chương trình hơn.
Arduino IDE 1.6.6 và mới hơn có C++ 11 được kích hoạt theo mặc định (chúng có cờ trình biên dịch "-std = gnu ++ 11" được đặt trong tệp platform.txt).
- 1. Làm cách nào để chuyển một chương trình Arduino sang .net để sử dụng trên Netduino?
- 2. Làm thế nào để cập nhật lên C++ 11?
- 3. C++ 11 constexpr để lập trình meta mẫu lỗi thời?
- 4. Làm thế nào để sử dụng -std-C++ 11 trong Eclipse C++
- 5. Làm thế nào để khẳng định rằng C++ 11 nên được sử dụng để biên dịch chương trình của tôi?
- 6. Làm thế nào để kiểm tra lambda trong C++ 11
- 7. Làm thế nào để thiết lập giá trị trong trục x MSChart sử dụng C#
- 8. Làm thế nào để thiết lập MaxReceivedMessageSize lập trình khi sử dụng WCF Client?
- 9. Android làm thế nào để thiết lập windowanimation lập trình
- 10. Làm thế nào để kết hợp các chuỗi C++ và các chuỗi Arduino?
- 11. Làm thế nào để lập trình tạo một phím tắt bằng cách sử dụng Win32
- 12. Trình bao bọc C++ để tăng/C++ 11
- 13. sử dụng C++ 11 trình giữ chỗ như lambdas?
- 14. C - làm thế nào để sử dụng PROGMEM để lưu trữ và đọc mảng char
- 15. Làm thế nào để sử dụng cấu trúc trong C?
- 16. Làm thế nào để thiết lập breakpoints lập trình trong Visual C++?
- 17. Làm cách nào để bật C++ 11 trong gcc?
- 18. Làm thế nào để đọc cho phép tập tin Linux lập trình trong C/C++
- 19. làm thế nào để lập trình socket ssl
- 20. Giả lập bàn phím chung sử dụng Arduino Leonardo
- 21. Làm cách nào để sử dụng các tính năng C++ 11 trong Clang?
- 22. Làm thế nào để dllexport một ++ Class C để sử dụng trong một C# ứng dụng
- 23. Làm thế nào để lập trình trong C# với TextMate làm IDE của tôi?
- 24. Làm thế nào để lập trình sử dụng JdbcTemplate của Spring?
- 25. Làm thế nào để sử dụng Bluetooth trong trình giả lập Android?
- 26. Làm thế nào để thêm maxItemsInObjectGraph lập trình mà không cần sử dụng tệp cấu hình?
- 27. Làm thế nào để lập trình một NSWindow toàn màn hình bằng cách sử dụng Lion?
- 28. Làm thế nào để sử dụng lựa chọn và FD_SET trong lập trình socket?
- 29. Làm thế nào để bạn sử dụng "C" bên ngoài để gọi hàm C++ trong C
- 30. C++ 11 loại để lập bản đồ enum?
Bạn có thể sử dụng platform.local.txt để gắn thêm cờ. echo "compiler.cpp.extra_flags = -std = gnu ++ 11"> ./hardware/arduino/avr/platform.local.txt – ticapix
Ít nhất mới nhất (atow) Arduino IDE không có '-std = gnu ++ 11 'gắn cờ trong nền tảng mặc định.txt. Và ở đây bạn có thể thấy cam kết [Bật hỗ trợ C++ 11: github.com/arduino/Arduino/commit/ddf4d878fdb39173b872f69149fb4cf1cd9fd017](https://github.com/arduino/Arduino/commit/ddf4d878fdb39173b872f69149fb4cf1cd9fd017#diff-0d45b5349ab1c852b7cad3e6b173e880). Cũng được đề cập ở đây http://stackoverflow.com/a/33718020/1338846 –
@ticapix Chỉ cần chắc chắn, tôi không nghĩ rằng platform.local.txt hoạt động nữa (một số báo cáo ở đây: https://github.com/arduino/Arduino/issue/3371). Btw, đối với người dùng Windows, platform.txt được đặt tại: 'C: \ Program Files (x86) \ Arduino \ hardware \ arduino \ avr' –