Memuat perpustakaan lokal

14

Saya baru mengenal pengembangan Arduino / C (berasal dari lingkungan JavaScript / Ruby), tetapi saya bertanya-tanya apakah mungkin untuk memasukkan perpustakaan dari folder khusus dalam sketsa?

Jadi inilah situasi saya;

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

Sekarang pertanyaan saya adalah: bagaimana saya bisa memasukkan perpustakaan khusus saya? Saya sudah mencoba beberapa variasi dalam hal ini;

# project.ino

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

Tapi tidak satu pun dari mereka yang berfungsi. Adakah yang bisa memberi tahu saya jika ini mungkin? Saya telah melihat pertanyaan ini di web, tetapi saya tidak dapat menemukan jawaban yang memuaskan. Semoga kalian bisa membantu.

Bersulang.

MEMPERBARUI

Saya sadar Anda dapat meletakkan perpustakaan Anda di folder perpustakaan global Anda, tetapi saya ingin mereka di folder proyek lokal saya. Saya ingin membagikannya melalui git dengan tim saya.

Stefan
sumber
3
Silakan baca pertanyaan saya lagi @Tyson. Saya mengetahui solusi perpustakaan global, tetapi saya ingin mereka di dalam proyek saya.
Stefan
Anda harus terlebih dahulu memberi tahu IDE tempat menemukan pustaka (lihat tautan sebelumnya) kemudian dalam sketsa Anda, Anda memanggil pustaka. `# cantumkan <LibraryName.h>` AFAIK Anda tidak dapat menggabungkan keduanya menjadi satu yang includemenentukan path / ke / library / yang merupakan apa yang saya kira Anda tanyakan.
Tyson
Oke, jadi saya tidak bisa memasukkan file dari subfolder .. Sayang sekali ..
Stefan
2
Anda tersandung pada kenyataan bahwa alat Arduino pada dasarnya tidak kompatibel dengan praktik perangkat lunak yang nyata, matang atau profesional. Mereka mungkin juga akan terus mengeluh tentang direktori .git itu, meskipun itu tidak akan merusak build.
Chris Stratton

Jawaban:

7

Oke, ini cara kerjanya, dan saya memeriksanya untuk memastikan.

Tentu Anda bisa menggunakan jalur keras, tetapi setiap programmer benci menggunakan jalur keras. Mereka tidak portabel sama sekali, dan mereka mengunci program Anda di tempat. Anda menggunakan tautan lunak atau keras ke file dalam proyek (lihat halaman manual di "ln"). Tapi, ... bicarakan jelek! Jadi pertanyaannya adalah bagaimana melakukannya dengan "benar"? Kuncinya adalah belajar dengan parameter apa dan di jalur apa C / C ++ berjalan.

Anda akan menemukan kesimpulannya TIDAK intuitif sama sekali. Memotong untuk mengejar: jalur relatif tidak berfungsi dengan benar. Sekarang kenapa?

Tetapi pertama-tama, izinkan saya menjelaskan mengapa ada orang yang ingin menempatkan file program di luar direktori proyek. Pemrogram suka menulis kelas program, struct, metode, fungsi, makro, dll., Sekali. Segera setelah programmer memadatkan fragmen program, ia ingin meletakkan file-file tersebut di pohon yang sama dan melanjutkan. Setiap program sesudahnya dapat menggunakan perpustakaan pribadi itu. Selain itu, dengan memiliki file di tempat utama, Anda tidak akan memiliki banyak salinan dan versi masing-masing. Satu perpustakaan pribadi untuk banyak program pribadi.

Pada 1.6.13 (Teensy belum mendukung 1.8. *), Relatif termasuk mulai dari perpustakaan , bukan direktori Anda. Tampaknya filter ano-ke-C (ingat bahwa Arduino melakukan "konversi" ke target kemudian memanggil kompiler C / C ++) mulai di mana Anda menginstal pohon Arduino Anda. Dalam kasus saya, saya menginstal di "~ / bin / arduino". Rumah Teensy adalah "./hardware/teensy". Seluruh path home untuk pustaka adalah "~ / bin / arduino / hardware / teensy / avr / libraries" di mana Anda akan menemukan semua pohon program dukungan.

Dalam file sumber, pernyataan '#include "test.hpp"' dengan benar memilih file dari direktori Anda saat ini. NAMUN, jika Anda menggunakan '#include "../test.hpp",' jalur sertakan tidak dimulai di direktori proyek Anda. Sebaliknya itu dimulai di "./libraries"! Jadi jalur yang dihasilkan adalah:

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

Kesimpulannya tidak ada cara bersih untuk membuat pohon alat Anda sendiri di direktori terdekat. Satu-satunya kursus adalah untuk melakukan pekerjaan Anda di perpustakaan Arduino dan mengetahui aturan-aturan itu juga.

Sean Walton
sumber
2

Saya baru saja kembali menggunakan arduino setelah beberapa waktu dan agak bingung dengan masalah yang sama dan bingung oleh info yang berbeda dari situs yang berbeda dan untuk versi ide yang berbeda.

Apa yang saya temukan adalah bahwa jika Anda memiliki sketsa di direktori, maka matikan Ide Anda dapat menjatuhkan file .h, .cpp ... dalam direktori dan ide, ketika dimulai kembali, akan membukanya dengan sketsa.

Sertakan mereka dengan menggunakan kutipan sederhana pada nama file, tidak ada jalur, tidak ada kurung sudut.

Saya yakin ini hanya sebagian dari jawaban lengkapnya, tetapi saya sudah mulai.

russ_hensel
sumber
2

Sejauh yang saya tahu, Anda dapat memasukkan perpustakaan Anda dari lokasi khusus dengan menggunakan jalur absolut mereka.

Karena jalur absolut bisa membosankan dari sudut pandang kode-portabilitas, Anda bisa mendefinisikan beberapa makro untuk mendapatkan jalur absolut dari jalur relatif yang diberikan. Dengan cara ini, Anda hanya perlu memperbaiki jalur 'proyek root' ketika berpindah dari satu perangkat ke perangkat lainnya.

Tentukan folder root proyek Anda:

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

Tentukan 'transformasi' makro relatif ke absolut:

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

Sertakan file Anda menggunakan jalur relatif:

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

Semoga bermanfaat.

Lorenzo Addazi
sumber
2

Plugin Arduino untuk Visual Studio mendukung perpustakaan lokal Anda dapat menemukan plugin di sini

Visual Mikro
sumber
2

Saya baru-baru ini menguji struktur perpustakaan lokal ini. Ini bekerja dengan:

#include "libs/MyNewLib/MyNewLib.h"

Arduino IDE 1.6.7 build pre-processing bahkan akan mengambil kode sumber untuk pustaka.

Bersulang!

Mikael Patel
sumber
1
Harus baru dalam 1,6,7
James Newton
Tampaknya memang versi yang lebih baru lebih fleksibel dan Anda dapat memasukkan pustaka di jalur relatif. Namun saya masih mengalami masalah ketika file yang disertakan juga termasuk file lain relatif terhadap lokasi mereka .
Sebastian
Hmm termasuk masalah yang baru saja saya tulis tidak berhubungan dengan path. Tampaknya Arduino IDE tidak menangani file * .ipp dengan baik. Lihat utas arduino forum ini
Sebastian
Tidak berfungsi untuk saya di 1.8.1 di Windows.
Violet Giraffe
1

Cara paling sederhana yang saya temukan untuk melakukan ini adalah menyimpan perpustakaan di direktori sketsa lokal Anda dan membuat tautan simbolis di direktori [HOME] / Arduino / libraries. Kemudian Anda dapat memeriksanya di Git dengan mudah dengan sketsa / proyek Anda dan Arduino masih senang karena perpustakaan dapat diakses di folder global.

Mungkin bahkan membuat skrip instal yang membuat tautan ini secara otomatis dan memeriksanya ke Git juga.

Matt Ball
sumber
0

Lain perbaikan yang sangat buruk - buat file bernama libraries.cpp, yang berisi:

// 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"

Tentu saja, ini hanya berfungsi jika perpustakaan itu sendiri tidak mengandung ...

Eric
sumber