Đang tải thư viện địa phương


14

Tôi chưa quen với việc phát triển Arduino / C (đến từ môi trường JavaScript / Ruby), nhưng tôi đã tự hỏi liệu có thể bao gồm một thư viện từ một thư mục tùy chỉnh trong một bản phác thảo không?

Vì vậy, đây là tình huống của tôi;

project.ino
libs/
  MyNewLib/
    MyNewLib.h
    MyNewLib.ccp

Bây giờ câu hỏi của tôi là: làm thế nào tôi có thể bao gồm thư viện tùy chỉnh của tôi? Tôi đã thử một vài biến thể về điều này;

# project.ino

#include <libs/MyNewLib/MyNewLib.h>
#include "libs/MyNewLib/MyNewLib.h"
#include <./libs/MyNewLib/MyNewLib.h>
#include "./libs/MyNewLib/MyNewLib.h"

Nhưng không ai trong số họ làm việc. Bất cứ ai có thể cho tôi biết nếu điều này là có thể? Tôi đã xem xét câu hỏi này trên web, nhưng tôi không thể tìm thấy câu trả lời thỏa mãn nào. Hy vọng các bạn có thể giúp đỡ.

Chúc mừng.

CẬP NHẬT

Tôi biết bạn có thể đặt thư viện của mình vào thư mục thư viện toàn cầu, nhưng tôi muốn chúng trong thư mục dự án cục bộ của tôi. Tôi muốn chia sẻ chúng thông qua git với nhóm của tôi.


3
Xin vui lòng đọc lại câu hỏi của tôi @Tyson. Tôi biết về giải pháp thư viện toàn cầu, nhưng tôi muốn chúng trong dự án của mình.
Stefan

Trước tiên bạn phải nói với IDE nơi tìm thư viện (xem liên kết trước) sau đó trong bản phác thảo của bạn, bạn gọi thư viện. `#include <LibraryName.h>` AFAIK bạn không thể kết hợp cả hai thành một includechỉ định đường dẫn / đến / thư viện / đó là những gì tôi đoán bạn đang hỏi.
Tyson

Được rồi, vì vậy tôi không thể bao gồm các tệp từ các thư mục con .. Thật đáng tiếc ..
Stefan


2
Bạn đang vấp phải sự thật rằng các công cụ Arduino về cơ bản không tương thích với các thực hành phần mềm thực tế, trưởng thành hoặc chuyên nghiệp. Có lẽ họ cũng sẽ liên tục phàn nàn về thư mục .git đó, mặc dù nó sẽ không thực sự phá vỡ bản dựng.
Chris Stratton

Câu trả lời:


7

Được rồi, đây là cách nó hoạt động, và tôi đã kiểm tra nó để đảm bảo.

Chắc chắn bạn có thể sử dụng các đường dẫn cứng, nhưng mọi lập trình viên đều ghét sử dụng các đường dẫn cứng. Chúng hoàn toàn không di động và chúng khóa chương trình của bạn tại chỗ. Bạn sử dụng các liên kết mềm hoặc cứng đến các tệp trong dự án (tra cứu các trang man trên "ln"). Nhưng, ... nói về xấu xí! Vì vậy, câu hỏi là làm thế nào để làm điều đó "chính xác"? Điều quan trọng là học với các tham số nào và trình biên dịch C / C ++ chạy trong đường dẫn nào.

Bạn sẽ thấy kết luận KHÔNG trực quan chút nào. Cắt theo đuổi: đường dẫn tương đối không hoạt động chính xác. Bây giờ tại sao?

Nhưng trước tiên, hãy để tôi giải thích lý do tại sao bất cứ ai cũng muốn đặt các tệp chương trình bên ngoài thư mục dự án. Các lập trình viên thích viết các lớp chương trình, cấu trúc, phương thức, hàm, macro, v.v., một lần. Ngay khi lập trình viên củng cố đoạn chương trình, anh ấy / cô ấy muốn đặt các tệp vào một cây chung và tiếp tục. Mọi chương trình sau đó có thể sử dụng thư viện riêng đó. Ngoài ra, bằng cách đặt các tệp ở vị trí trung tâm, bạn sẽ không có nhiều bản sao và phiên bản của mỗi tệp. Một thư viện riêng cho nhiều chương trình riêng tư.

Kể từ 1.6.13 (Teensy chưa hỗ trợ 1.8. *), Họ hàng bao gồm bắt đầu từ thư viện , không phải thư mục của bạn. Dường như bộ lọc ano-C (hãy nhớ rằng Arduino thực hiện "chuyển đổi" thành mục tiêu sau đó gọi trình biên dịch C / C ++) bắt đầu khi bạn cài đặt cây Arduino của mình. Trong trường hợp của tôi, tôi đã cài đặt trong "~ / bin / arduino". Nhà của thiếu niên là "./hardware/teensy". Toàn bộ đường dẫn nhà cho các thư viện là "~ / bin / arduino / phần cứng / youthy / avr / library" nơi bạn sẽ tìm thấy tất cả các cây chương trình hỗ trợ.

Trong tệp nguồn, câu lệnh '#include "test.hpp"' chọn chính xác tệp từ thư mục hiện tại của bạn. TUY NHIÊN, nếu bạn sử dụng '#include "../test.hpp",' đường dẫn bao gồm không bắt đầu trong thư mục dự án của bạn. Thay vào đó, nó bắt đầu trong "./l Thư viện"! Vì vậy, đường dẫn kết quả là:

#include "../test.hpp" ==> ./arduino/hardware/teensy/avr/libraries/test.hpp

Tóm lại, không có cách nào rõ ràng để tạo cây công cụ của riêng bạn trong một thư mục gần đó. Khóa học duy nhất là cam kết công việc của bạn trong thư viện Arduino và nhận thức được các quy tắc đó.


2

Tôi chỉ quay lại sử dụng arduino sau một thời gian và hơi hoang mang trước các vấn đề tương tự và bị nhầm lẫn bởi thông tin khác nhau từ các trang web khác nhau và cho các phiên bản khác nhau của ide.

Những gì tôi đã tìm thấy là nếu bạn có một bản phác thảo trong một thư mục, sau đó tắt Ide, bạn có thể thả các tệp .h, .cpp ... trong thư mục và ide, khi được khởi động lại, sẽ mở chúng bằng bản phác thảo.

Bao gồm chúng bằng cách sử dụng dấu ngoặc đơn giản trên tên tệp, không có đường dẫn, không có dấu ngoặc góc.

Tôi chắc chắn đây chỉ là một phần của câu trả lời đầy đủ, nhưng nó đã giúp tôi bắt đầu.


2

Theo tôi biết, bạn có thể bao gồm các thư viện của mình từ một vị trí tùy chỉnh bằng cách sử dụng đường dẫn tuyệt đối của chúng.

Vì các đường dẫn tuyệt đối có thể nhàm chán theo quan điểm về tính di động của mã, bạn có thể xác định một số macro để có được đường dẫn tuyệt đối từ một đường dẫn tương đối nhất định. Theo cách này, bạn sẽ chỉ phải sửa đường dẫn 'dự án gốc' khi truyền từ thiết bị này sang thiết bị khác.

Xác định thư mục gốc của dự án của bạn:

    #define PROJECT_ROOT C:\path\to\your\project\folder

Xác định một 'chuyển đổi' macro tương đối đến tuyệt đối:

    #define TO_STRING(s) #s
    #define ABSOLUTE_PATH(root, relative_path) TO_STRING(root\relative_path)
    #define RELATIVE_PATH(library) ABSOLUTE_PATH(PROJECT_ROOT, library)

Bao gồm các tệp của bạn bằng cách sử dụng đường dẫn tương đối:

    #include RELATIVE_PATH(some\file\relative\path.h)
    #include RELATIVE_PATH(another\file\relative\path.h)

Tôi hy vọng nó sẽ hữu ích.



2

Gần đây tôi đã thử nghiệm cấu trúc thư viện địa phương này. Nó hoạt động với:

#include "libs/MyNewLib/MyNewLib.h"

Quá trình tiền xử lý xây dựng Arduino IDE 1.6.7 thậm chí sẽ lấy mã nguồn cho thư viện.

Chúc mừng!


1
Phải là người mới trong 1.6.7
James Newton

Có vẻ như các phiên bản mới hơn linh hoạt hơn và bạn có thể bao gồm các thư viện trong các đường dẫn tương đối. Tuy nhiên tôi vẫn gặp vấn đề khi các tệp được bao gồm cũng bao gồm các tệp khác liên quan đến vị trí của chúng .
Sebastian

Hmm các vấn đề bao gồm tôi vừa viết không liên quan đến đường dẫn. Dường như Arduino IDE không xử lý tốt các tệp * .ipp. Xem chủ đề diễn đàn arduino
Sebastian

Không hoạt động với tôi trong 1.8.1 trên Windows.
Hươu cao cổ Violet

1

Cách đơn giản nhất mà tôi tìm thấy để làm điều này là lưu trữ các thư viện trong thư mục phác thảo cục bộ của bạn và tạo một liên kết tượng trưng trong thư mục [HOME] / Arduino / library. Sau đó, bạn có thể kiểm tra chúng dễ dàng với Git bằng bản phác thảo / dự án của bạn và Arduino vẫn vui vì các thư viện có thể truy cập được trong thư mục toàn cầu.

Thậm chí có thể tạo một tập lệnh cài đặt tự động tạo các liên kết này và kiểm tra nó vào Git.


0

Một cách khắc phục thực sự tồi tệ khác - tạo một tệp có tên libraries.cpp: chứa:

// force the linker to build the libraries
#include "libraries/LIB1/src/FILE1.cpp"
#include "libraries/LIB1/src/FILE2.cpp"
#include "libraries/LIB2/src/FILE1.cpp"

Tất nhiên, điều này chỉ hoạt động nếu thư viện không chứa bất kỳ bao gồm ...

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.