โหลดห้องสมุดท้องถิ่น


14

ฉันยังใหม่กับการพัฒนา Arduino / C (มาจากสภาพแวดล้อม JavaScript / Ruby) แต่ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะรวมไลบรารีจากโฟลเดอร์ที่กำหนดเองภายในร่าง

นี่คือสถานการณ์ของฉัน

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

ตอนนี้คำถามของฉันคือ: ฉันจะรวมห้องสมุดที่กำหนดเองได้อย่างไร ฉันได้ลองหลายรูปแบบแล้ว

# project.ino

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

แต่ไม่มีใครทำงานเลย มีใครบอกฉันได้ไหมว่ามันเป็นไปได้ไหม ฉันได้ดูคำถามนี้ในเว็บ แต่ฉันไม่สามารถหาคำตอบที่น่าพอใจได้ หวังว่าพวกคุณจะช่วยได้

ไชโย

UPDATE

ฉันรู้ว่าคุณสามารถวางห้องสมุดของคุณลงในโฟลเดอร์ไลบรารีทั่วโลกของคุณ แต่ฉันต้องการมันในโฟลเดอร์โครงการท้องถิ่นของฉัน ฉันต้องการแบ่งปันผ่านคอมไพล์กับทีมของฉัน


4
โปรดอ่านคำถามของฉันอีกครั้ง @Tyson ฉันตระหนักถึงวิธีแก้ปัญหาห้องสมุดทั่วโลก แต่ฉันต้องการให้พวกเขาอยู่ในโครงการของฉัน
สเตฟาน

คุณต้องบอก IDE ก่อนว่าจะหาห้องสมุดได้อย่างไร (ดูลิงค์ก่อนหน้า) จากนั้นภายในร่างของคุณคุณเรียกห้องสมุด `#include <LibraryName.h>` AFAIK คุณไม่สามารถรวมทั้งสองเป็นหนึ่งเดียวเพื่อincludeระบุพา ธ / ไปยัง / ไลบรารี / ซึ่งเป็นสิ่งที่ฉันคิดว่าคุณถาม
Tyson

1
โอเคดังนั้นฉันจึงไม่สามารถรวมไฟล์จากโฟลเดอร์ย่อย .. น่าเสียดาย ..
Stefan


2
คุณสะดุดกับความจริงที่ว่าเครื่องมือ Arduino ไม่เข้ากันกับการใช้งานซอฟต์แวร์ที่เป็นผู้ใหญ่หรือเป็นมืออาชีพ พวกเขาอาจจะบ่นอย่างไม่หยุดหย่อนเกี่ยวกับไดเรกทอรี. git ที่ไม่หยุดยั้ง
Chris Stratton

คำตอบ:


7

ตกลงนี่เป็นวิธีการทำงานและฉันตรวจสอบเพื่อให้แน่ใจ

แน่ใจว่าคุณสามารถใช้ฮาร์ดไดรฟ์ได้ แต่โปรแกรมเมอร์ทุกคนเกลียดการใช้ฮาร์ดไดรฟ์ มันไม่ได้พกพาเลยและล็อคโปรแกรมไว้ คุณใช้ลิงค์นุ่มหรือฮาร์ดไปยังไฟล์ในโครงการ (ค้นหาหน้าคนใน "ln") แต่ ... พูดถึงน่าเกลียด! ดังนั้นคำถามคือทำอย่างไร "ถูกต้อง"? กุญแจสำคัญคือการเรียนรู้กับพารามิเตอร์ใดและในเส้นทางใดที่คอมไพเลอร์ C / C ++ ทำงาน

คุณจะพบข้อสรุปที่ไม่ง่ายเลย การตัดไปที่การไล่ล่า: เส้นทางที่สัมพันธ์กันทำงานไม่ถูกต้อง ตอนนี้ทำไม

แต่ก่อนอื่นให้ฉันอธิบายว่าทำไมทุกคนต้องการวางไฟล์โปรแกรมไว้นอกไดเรกทอรีโครงการ โปรแกรมเมอร์เช่นการเขียนคลาสโปรแกรม, structs, เมธอด, ฟังก์ชั่น, มาโคร, ฯลฯ เพียงครั้งเดียว ทันทีที่โปรแกรมเมอร์ทำให้ชิ้นส่วนของโปรแกรมนั้นแข็งเขา / เธอต้องการที่จะวางไฟล์ในทรีทั่วไปและไปต่อ ทุกโปรแกรมหลังจากนั้นสามารถใช้ไลบรารีส่วนตัวนั้นได้ นอกจากนี้เมื่อมีไฟล์ในที่ส่วนกลางคุณจะไม่ได้รับสำเนาหลายชุดและเวอร์ชั่นต่างกัน ห้องสมุดส่วนตัวหนึ่งแห่งสำหรับโปรแกรมส่วนตัวมากมาย

ตั้งแต่วันที่ 1.6.13 (วัยรุ่นยังไม่สนับสนุน 1.8. *) ญาติรวมถึงการเริ่มต้นจากห้องสมุดไม่ใช่ไดเรกทอรีของคุณ ดูเหมือนว่าตัวกรอง ano-to-C (จำไว้ว่า Arduino ทำ "การแปลง" ไปยังเป้าหมายจากนั้นเรียกคอมไพเลอร์ C / C ++) เริ่มต้นที่คุณติดตั้งต้นไม้ Arduino ของคุณ ในกรณีของฉันฉันติดตั้งใน "~ / bin / arduino" บ้านของวัยรุ่นคือ "./hardware/teensy" เส้นทางภายในบ้านทั้งหมดสำหรับไลบรารีคือ "~ / bin / arduino / hardware / teensy / avr / libraries" ซึ่งคุณจะพบแผนผังโปรแกรมสนับสนุนทั้งหมด

ในไฟล์ต้นฉบับคำสั่ง '#include "test.hpp"' จะเลือกไฟล์จากไดเรกทอรีปัจจุบันของคุณอย่างถูกต้อง อย่างไรก็ตามถ้าคุณใช้ '#include "../test.hpp",' พา ธ รวมจะไม่เริ่มในไดเรกทอรีโครงการของคุณ แต่จะเริ่มใน "./l ไลบรารี"! ดังนั้นเส้นทางที่ได้คือ:

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

สรุปได้ว่าไม่มีวิธีที่สะอาดในการสร้างแผนผังเครื่องมือในไดเรกทอรีใกล้เคียง หลักสูตรเดียวคือการมอบหมายงานของคุณในห้องสมุด Arduino และตระหนักถึงกฎเหล่านั้นเช่นกัน


2

ฉันเพิ่งกลับมาใช้อาร์ดิโนหลังจากผ่านไประยะหนึ่งและค่อนข้างสับสนกับปัญหาที่คล้ายกันและสับสนโดยข้อมูลที่แตกต่างจากไซต์ต่าง ๆ และสำหรับ IDE รุ่นต่าง ๆ

สิ่งที่ฉันได้พบคือถ้าคุณมีร่างในไดเรกทอรีแล้วปิด IDE คุณสามารถวาง. h, .cpp ... ไฟล์ในไดเรกทอรีและ IDE เมื่อรีสตาร์ทจะเปิดพวกเขาด้วยร่าง

รวมพวกเขาโดยใช้เครื่องหมายคำพูดง่ายๆในชื่อไฟล์ไม่มีพา ธ ไม่มีวงเล็บเหลี่ยม

ฉันแน่ใจว่านี่เป็นเพียงส่วนหนึ่งของคำตอบเต็ม แต่ฉันได้เริ่มแล้ว


2

เท่าที่ฉันรู้คุณสามารถรวมไลบรารีของคุณจากตำแหน่งที่กำหนดเองโดยใช้เส้นทางสัมบูรณ์

เนื่องจากเส้นทางที่แน่นอนอาจน่าเบื่อจากมุมมองของการพกพาโค้ดคุณจึงสามารถกำหนดมาโครบางตัวเพื่อรับเส้นทางที่สมบูรณ์จากญาติที่ระบุ ด้วยวิธีนี้คุณจะต้องแก้ไขเส้นทาง 'project root' เมื่อส่งผ่านจากอุปกรณ์หนึ่งไปยังอุปกรณ์อื่น

กำหนดโฟลเดอร์รูทของโครงการ:

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

นิยาม 'การเปลี่ยนแปลง' แมโครที่สัมพันธ์กับสัมบูรณ์:

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

รวมไฟล์ของคุณโดยใช้พา ธ สัมพัทธ์:

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

ฉันหวังว่ามันจะมีประโยชน์



2

ฉันเพิ่งทดสอบโครงสร้างห้องสมุดท้องถิ่นนี้ มันทำงานร่วมกับ:

#include "libs/MyNewLib/MyNewLib.h"

Arduino IDE 1.6.7 build-processing ล่วงหน้าจะได้รับซอร์สโค้ดสำหรับไลบรารี

ไชโย!


1
ต้องใหม่ใน 1.6.7
James Newton

ดูเหมือนว่ารุ่นที่ใหม่กว่านั้นมีความยืดหยุ่นมากกว่าและคุณสามารถรวมไลบรารีในเส้นทางที่สัมพันธ์กันได้ อย่างไรก็ตามฉันยังพบปัญหาเมื่อไฟล์ที่รวมยังรวมถึงไฟล์อื่น ๆ ที่เกี่ยวข้องกับที่ตั้งของพวกเขา
เซบาสเตียน

อืมปัญหารวมที่ฉันเพิ่งเขียนเกี่ยวกับไม่เกี่ยวข้องกับเส้นทาง ดูเหมือนว่า Arduino IDE ไม่สามารถจัดการไฟล์ * .ipp ได้ดี ดูกระทู้ฟอรั่ม arduino
Sebastian

ใช้งานไม่ได้กับฉันใน 1.8.1 บน Windows
Violet Giraffe

1

วิธีที่ง่ายที่สุดที่ฉันพบคือการจัดเก็บไลบรารีในไดเรคทอรีร่างของคุณและสร้างลิงค์สัญลักษณ์ในไดเรกทอรี [HOME] / Arduino / ไลบรารี จากนั้นคุณสามารถตรวจสอบพวกเขาใน Git ได้อย่างง่ายดายด้วยร่าง / โครงการของคุณและ Arduino ยังคงมีความสุขเพราะห้องสมุดสามารถเข้าถึงได้ในโฟลเดอร์ทั่วโลก

อาจสร้างสคริปต์ติดตั้งที่สร้างลิงก์เหล่านี้โดยอัตโนมัติและตรวจสอบว่าเป็น Git ด้วย


0

การแก้ไขที่ไม่ดีอีกอย่างหนึ่ง - สร้างไฟล์ชื่อlibraries.cppซึ่งมี:

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

แน่นอนว่าจะใช้งานได้ก็ต่อเมื่อห้องสมุดไม่มีตัวเลือกใด ๆ ในการรวม ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.