Tại sao một tệp `.ino` phải nằm trong một thư mục cùng tên?


12

Tôi đang cố gắng tổ chức một dự án rất phức tạp và tôi muốn đặt tất cả mã thực tế vào một thư mục có tên src(nguồn), nhưng tôi muốn giữ .inotệp chính là main.ino(nó cũng sẽ nằm trong src). Sau đó, khi tôi cố gắng mở mã, IDE nói rằng nó main.inophải nằm trong một thư mục có tên main.

Tại sao lại thế này?

Tôi hoàn toàn hiểu thông báo lỗi, nhưng tại sao việc đặt tên tệp trong Arduino phải như vậy. Có cách nào để thay đổi điều đó?

Câu trả lời:


6

AFAIK, đó là một cách giải quyết được tích hợp trong Arduino IDE. Cách giải quyết tốt nhất tôi có thể nghĩ đến là một cấu trúc tệp giống như:

ArduinoWorkspace --- /myproj/ ----+ /src/ --------+ myproj.cpp
                                  + myproj.ino    + sensor.h
                                                  + sensor.cpp
                                                  + (more files)

, trong đó myproj.cpp chỉ #includelà main.cpp. Điều này sẽ để các tệp dự án của bạn "sạch" để chúng cũng hoạt động trong một môi trường điển hình hơn.

Cập nhật:

Tôi đã mượn tên "chính" từ câu hỏi của bạn, nhưng theo phản ánh, "chính" là một tên dành riêng, cụ thể, mọi chương trình C hoặc C ++ đều có mã main.c hoặc main.cpp làm mã cấp cao nhất, được cung cấp bởi hệ thống nếu bạn không cung cấp một cái. Vì vậy, tôi đã tránh sử dụng nó làm tên thư mục và tên dự án (nhưng cứ thoải mái thử nó) và tôi đã cập nhật sơ đồ. Những gì bạn cần là một thư mục dự án và một tệp .ino trong đó, cùng tên. Tệp .ino có thể

#include <src/anything-else-you-like>

, ví dụ, tệp mã cấp cao nhất của bạn, do đó kéo mọi thứ khác. Bạn có thể cần .ino của mình cho #includetừng tệp trong srcthư mục, nếu trình biên dịch không tự tìm ra, đó là nơi chứa các tệp khác của bạn.

BTW, nếu bạn sử dụng tên main.cpp cho tệp trên cùng của mình, nó sẽ phải gọi các hàm setup () và loop () (và hàm sự kiện nối tiếp, nếu bạn sử dụng tên đó). Có lẽ tốt nhất là để riêng tên 'chính', để hệ thống cung cấp cùng một chính mỗi chương trình Arduino được mặc định và viết mã dự án của bạn theo cách Arduino điển hình - bắt đầu bằng setup () và loop ().


myproj.cppý bạn là myproj.inosao Bởi vì tôi không thấy nó ở đâu myproj.cpp!
Đạt Hà

Ok, một vấn đề nhỏ, nếu tôi làm điều này, một số chức năng cơ bản của Arduino (như map () và analogRead ()) có trong sensor.cpp sẽ không được trình biên dịch nhận ra.
Đạt Hà

Ngoài ra, nếu làm việc trên hộp Windows, hãy sử dụng lệnh nối và "liên kết" thư mục tên chính xác đến thư mục có tên tốt hơn. Hoặc, nếu làm việc trên hộp Linux, hãy sử dụng lệnh liên kết tượng trưng để làm tương tự.
st2000

(Xem cập nhật của tôi - tệp .ino của bạn có thể phải bao gồm từng tệp khác).
JRobert

3

Khi bạn có một dự án được tạo thành từ một số .INOtệp, làm thế nào để IDE biết cái nào là "chính"? Trong quá trình biên dịch, IDE ghép tất cả các .INOtệp lại với nhau thành một tệp nguyên khối. Nó thực hiện điều này bắt đầu với cái "chính" và sau đó nối thêm từng cái khác theo thứ tự abc vào cuối.

Nó được thực hiện theo cách này sao cho các biến bao gồm và biến toàn cục của bạn, mà bạn nên đặt trong .INOtệp "chính" của mình , khi bắt đầu chương trình hoàn thành.

Để làm được điều này, IDE phải biết tập tin nào là "chính". Và cách nó hoạt động là bằng cách tìm ra cái được đặt tên giống như thư mục mà bản phác thảo đang ở.

Trong UECIDE, tôi tiến thêm một bước và biến toàn bộ thư mục thành tài liệu ghép để bạn không còn phải nhập thư mục và mở .INOtệp để mở bản phác thảo - chính thư mục thực tế là toàn bộ dự án phác thảo. Một lần nữa loại thư mục này được xác định là có một .INOtệp trong đó được đặt tên giống như thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.