2013-04-12 34 views

Trả lời

32

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),

  1. 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
  2. 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++.
  3. 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".
  4. 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.

+3

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

+3

Í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 –

+0

@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' –

14

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 
+0

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

+0

@Polar Đã cập nhật. – asheeshr

+1

Đâ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

1

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); 
} 
  1. Biên dịch chương trình.
  2. Đổ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).
  3. 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!

+0

Tôi nhận được nhận xét, rằng tập tin không được tìm thấy trong IDE của tôi. – dgrat

+0

Tôi xin lỗi, tôi đã không theo dõi câu hỏi. Nếu vẫn còn có liên quan, xin vui lòng, cho tôi biết. Cảm ơn! – fAX

1

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.

15

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).

Các vấn đề liên quan