2011-06-28 15 views
15

मैं एक आर्डिनो लाइब्रेरी (प्रभावी रूप से एक सी ++ कक्षा) लिखने की कोशिश कर रहा हूं जो स्वयं मेरे मैक के ~/दस्तावेज़/Arduino/पुस्तकालय निर्देशिका में स्थापित एक और पुस्तकालय का संदर्भ देता है।क्या Arduino IDE का उपयोग कर किसी अन्य लाइब्रेरी से लाइब्रेरी को शामिल करना संभव है?

पुस्तकालय मैं लिख रहा हूँ के सीपीपी के शीर्ष पर, मैं

#include <ReferencedLibrary.h> 

और

#include "ReferencedLibrary.h" 

... जो काम की न कोशिश की है। मैं अपने ~/दस्तावेज़/Arduino निर्देशिका में स्केच से सफलतापूर्वक #include <ReferencedLibrary.h> कर सकता हूं। क्या मुझे कुछ याद आ रहा है या क्या यह Arduino IDE/makefile की सीमा है? क्या आसपास कोई काम है?

उत्तर

6

यह समस्या Arduino 1.6.6 रिलीज में हल की गई थी। 1.6.6 के रिलीज नोट्स का उल्लेख है कि पुस्तकालय निर्भरताओं के लिए लाइब्रेरी तय की गई है।

पुस्तकालय निर्भरता को लाइब्रेरी: जब आपके स्केच एक पुस्तकालय का आयात करता है, और कहा कि पुस्तकालय एक और उपयोग करता है, आईडीई आप अपने स्केच

करने के लिए एक बेकार # शामिल जोड़ने के लिए अपने संस्करण अद्यतन कर रहा है बिना पता चलेगा 1.6.6 या इससे पहले आपकी समस्या का समाधान होगा।

10

प्रलेखन यहाँ http://www.arduino.cc/en/Hacking/BuildProcess कहता है:

पथ शामिल स्केच के निर्देशिका भी शामिल है, लक्ष्य निर्देशिका (/ हार्डवेयर/कोर //) और AVR शामिल निर्देशिका (/ हार्डवेयर/उपकरण/avr/avr/include /), साथ ही साथ किसी लाइब्रेरी निर्देशिका ( /हार्डवेयर/पुस्तकालयों /) में में हेडर फ़ाइल होती है जो मुख्य स्केच फ़ाइल द्वारा शामिल है।

इसका मतलब यह है कि आप अपने मुख्य #include "ReferencedLibrary.h" स्केच फ़ाइल से, इस का कारण बनता है, तो उस फ़ाइल के libraries निर्देशिका में शामिल पथ को जोड़ा गया पाने के लिए अन्य पुस्तकालयों को शामिल करने के लिए। एक हैक का थोड़ा सा लेकिन यह मेरे मैक पर काम करता है।

+1

यह एक हैक जैसा प्रतीत हो सकता है, लेकिन यह पूरे प्रसंस्करण प्रतिमान के अनुरूप है। असल में एक स्केच ऐसा होता है जिसे आप सभी काम करने वाले टुकड़ों को एक साथ फ्यूज करने के लिए उपयोग करते हैं ताकि स्केच में सभी गोंद तर्क प्रदान करना बहुत उपयुक्त हो। – SRM

+14

यह "बुराई" है। लाइब्रेरी का विचार अमूर्त कार्यक्षमता है और उपयोग के लिए एक संक्षिप्त API प्रदान करता है। '# शामिल करें" lib.h "लाइब्रेरी प्राप्त करने के लिए यह सब कुछ होना चाहिए (मान लें कि यह लोड पथ में है)। लाइब्रेरी के आंतरिक कार्यों के बारे में जानने के लिए लाइब्रेरी के क्लाइंट की आवश्यकता सिर्फ सादा गलत है। –

+0

चर्चा है जो कहती है कि उपयोगकर्ता को मुख्य स्केच में सभी संदर्भित पुस्तकालयों को शामिल करना होगा। हालांकि, ऐसा करने से मैक्रोज़ या सरणी के लिए कई परिभाषा त्रुटियां उत्पन्न होती हैं जो निर्भर पुस्तकालय शीर्षलेख में परिभाषित होती हैं और उन स्रोतों को प्राप्त करने में सक्षम नहीं होने पर निर्भर स्रोत फ़ाइल परिणामों में शीर्षलेख को छोड़कर। लाइब्रेरी निर्भरताओं को पूरा करने का एकमात्र तरीका एक ही निर्देशिका में सभी शीर्षलेखों और स्रोतों को शामिल करना है (या अन्य सभी के माध्यम से चलने वाले बयान शामिल हैं और सापेक्ष के पथ को बदलते हैं, एक तीसरे पक्ष के लिब को लपेटते समय और शायद ही पोर्टेबल होते हैं)। –

3

Arduino वातावरण का उपयोग करके, जैसा कि मैं इसे समझता हूं, आप अपनी खुद की लाइब्रेरी से अपनी लाइब्रेरी तक नहीं पहुंच सकते हैं। पथ जोड़ने का कोई तरीका नहीं है, इसलिए संकलक को कोड ढूंढने का कोई तरीका नहीं है। इससे पुस्तकालयों को लिखना मुश्किल हो जाता है जो आपके पुस्तकालयों में कोड का उपयोग करते हैं। मेरा वेब शोध इंगित करता है कि यह वर्षों से एक समस्या है लेकिन मेरे ज्ञान को हल नहीं किया गया है। मुझे संदेह है कि कार्यान्वयन के विवरण में कठिनाइयों या शायद क्षमता की कीमत पर सिस्टम को सरल रखने की इच्छा है।

बेशक, आप हमेशा प्रत्येक नई लाइब्रेरी में कोड काट और पेस्ट कर सकते हैं, लेकिन यह अत्यधिक उप-इष्टतम है। आप .h और .cpp फ़ाइलों की एक जोड़ी में अपने सभी कोड के साथ एक विशाल लाइब्रेरी भी लिख सकते हैं। यह भी बहुत संतोषजनक नहीं है, लेकिन मैंने इसे अवसर पर किया है।

हालांकि, अपनी खुद की लाइब्रेरी में मानक Arduino पुस्तकालयों का उपयोग करने के लिए एक कार्य है जो आप अपनी स्केचबुक/पुस्तकालय निर्देशिका में रख रहे हैं। चूंकि स्केच में मानक लाइब्रेरी स्थानों के पथ शामिल होते हैं, और मानक लाइब्रेरी कोड को लिंक करते हैं, इसलिए आप अपने स्केच में रुचि के मानक लाइब्रेरी के लिए हेडर फ़ाइल शामिल कर सकते हैं। इसके नीचे, आपके स्केच में भी, अपनी लाइब्रेरी हेडर फ़ाइल शामिल करें। मानक लाइब्रेरी तब आपकी लाइब्रेरी के साथ-साथ आपके स्केच पर भी उपलब्ध हो जाएगी।

+0

@ जुलीओटेरा का जवाब देखें, यह मेरे लिए काम करता है। – vadipp

11

मैं एक सापेक्ष पथ का उपयोग कर किसी अन्य Arduino लाइब्रेरी में एक पुस्तकालय शामिल करने में सक्षम हूं।उदाहरण के लिए, AbstractSwitch पुस्तकालय DigitalSwitch पुस्तकालय में, यह सोचते हैं कि इन पुस्तकालयों के दोनों Arduino के मानक पुस्तकालय फ़ोल्डर के भीतर अपने स्वयं के अलग फ़ोल्डर में रहते हैं, शामिल करने के लिए आप निम्न का उपयोग कर सकते बयान में शामिल हैं:

#include "../AbstractSwitch/AbstractSwitch.h" 

दूसरे शब्दों में, आपके शामिल कथन को पढ़ना चाहिए:

#include "../LibraryFolder/LibraryHeaderFile.h" 
+1

मुझे लिंकर चरण के दौरान 'अपरिभाषित संदर्भ' त्रुटियां मिलती हैं। ऐसा लगता है कि हेडर शामिल है लेकिन स्रोत फ़ाइलों को संकलित या लिंक नहीं किया गया है। – Justin808

+1

वही .. Arduino 1.0.5 .. इस तरह की एक साधारण सुविधा - कोई समाधान नहीं। – flyandi

+0

@ जस्टिन 808 आप भी उसी तरह से .cpp फ़ाइलों को शामिल कर सकते हैं, जो मेरे लिए काम करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे