2012-08-26 11 views
9

कहें कि मुझे इंटरनेट में एक बहुत अच्छी ओपन सोर्स लाइब्रेरी मिलती है और अब मैं इसे अपने स्वयं के प्रोजेक्ट के लिए उपयोग करना चाहता हूं।कंपाइलर विकल्पों को ढूंढने वाले बाहरी शीर्षलेखों सहित

मैं इसे डाउनलोड करता हूं, संभवतः इसे संकलित करता हूं और शीर्षलेख फ़ाइलों को & स्थिर/गतिशील लाइब्रेरी प्राप्त करता हूं।

इसलिए मैं अपनी खुद की स्रोत फ़ाइलों को लिखना शुरू करता हूं और निश्चित रूप से जब मैं इस बाहरी पुस्तकालय से कार्यक्षमता का उपयोग करना चाहता हूं तो इसमें मेरे स्रोत फ़ाइलों में सही शीर्षलेख शामिल हैं।

अब मैं अपनी स्रोत फ़ाइल संकलित करता हूं, सुनिश्चित करें कि इस बाहरी पुस्तकालय के लिए पथ और लिंकर विकल्प शामिल हैं सही ढंग से सेट हैं।

और मुझे बाहरी शीर्षकों से आने वाली त्रुटियों के ढेर मिलते हैं। बाहर निकलता है उन्हें कुछ कंपाइलर झंडे की आवश्यकता होती है।

मैं न्यूनतम संकलक झंडे को कैसे ढूंढूं जो मुझे सेट करना है (बाहरी पुस्तकालय से हेडर को संकलित करने में सक्षम होने के लिए)?

क्या मैं इसके बारे में अब तक सोचा है:

  1. स्रोत के निर्माण लिपि में उन्हें देखो (काफी मुश्किल हो सकता है, के बाद से वहाँ कई स्थानों पर जहां वे परिभाषित किया जा सकता है और वे कर सकते हैं नहीं कम से कम झंडे, हर त्रुटि संदेश हो के बाद से वे एक साथ सभी हेडर के लिए आवश्यक हो सकता है, लेकिन विशिष्ट लोगों के लिए नहीं मैं का उपयोग करें)
  2. गूगल और उम्मीद है कि इस सवाल का जवाब दे देंगे (त्रुटि संदेशों में से एक बहुत कुछ के साथ कठिन हो सकता है और Google को जवाब नहीं पता हो सकता है, या मुझे जवाब खोजने के लिए सही कीवर्ड नहीं पता हो सकता है)
  3. शायद कुछ कैसे अपने ही परियोजना में बाहरी पुस्तकालय के निर्माण स्क्रिप्ट 'शामिल' (बहुत कठिन हो सकता है, के बाद से मैं एक अलग निर्माण प्रणाली का उपयोग करना चाहें और मैं शायद पूरी तरह से निर्माण प्रणाली अपने आप को, जिसके लिए मुश्किल हो सकता है समझने के लिए होगा बड़े पुस्तकालय)
+0

ऐसा लगता है कि यह आमतौर पर एक बिल्ड सिस्टम समस्या है? अन्य प्रोजेक्ट बिल्डसिस्टम का उपयोग करने के बजाय आप अपने प्रोजेक्ट में अन्य स्रोत कोड क्यों शामिल करते हैं? मुझे पता है कि बिल्डसिस्टम गधे में दर्द है, लेकिन यही वह है जो उन्हें बनाया गया था। – Alex

+0

मैं केवल अन्य प्रोजेक्ट के शीर्षलेख शामिल करता हूं। मुझे नहीं पता कि मुझे हेडर के बिना अन्य परियोजना की सी/++ परिभाषाओं का उपयोग कैसे करना है। – DevBen

उत्तर

1

किसी भी अच्छी तरह से व्यवहार किया है कि उनके विकास फ़ाइलों का उपयोग करने के निर्देशों के साथ खुला स्रोत पुस्तकालय जहाजों पर। जीएनयू/लिनक्स प्रणाली, यह pkg-config फ़ाइलें (* .pc) विकास हेडर और पुस्तकालयों के लिए एक साथ स्थापित करने के लिए सामान्य है, जो मामले pkg-config --cflags library-name में आवश्यक संकलन विकल्पों के बारे में बता देंगे।

कहाँ pkg-config इस्तेमाल किया जा सकता, इसके बारे में अभी बात है बिल्ड-सिस्टम को बताएं कि आप कौन से घटक आयात करना चाहते हैं। ऑटोटूल पर।

PKG_CHECK_MODULES([DEPS], [libname]) 

और फिर DEPS_CFLAGS और DEPS_LIBS .am फ़ाइलों पर चर का उपयोग करें।

उदा। एक खोल कमांड लाइन पर:

$ gcc $(pkg-config --cflags libname) -c main.c 
$ gcc $(pkg-config --libs libname) main.o -o test.exe 

वैसे भी, अगर आप पुस्तकालय का इस्तेमाल किया और जिसके बारे में विशिष्ट जानकारी पोस्ट कर सकता और अधिक उत्पादक हो जाएगा त्रुटियों उत्पन्न किया जा रहा है।

+0

ओह वाह, मुझे पीकेजी-कॉन्फ़िगरेशन के बारे में भी पता नहीं था, लेकिन वह एक महान समाधान की तरह लगता है। क्या पीकेजी-कॉन्फ़िगरेशन अधिक लोकप्रिय ओपन सोर्स प्रोजेक्ट्स के बीच बहुत लोकप्रिय है? हेडर फ़ाइलों के लिए आवश्यक कंपाइलर झंडे के बारे में अच्छा दस्तावेज नहीं होने पर किसी ऐसी रणनीति पर कोई सलाह नहीं है जो किसी का उपयोग कर सके? – DevBen

+0

हां, 'पीकेजी-कॉन्फ़िगरेशन' को एफओएसएस परियोजनाओं के बीच * वास्तविक तथ्य * माना जा सकता है। मुझे यकीन नहीं है कि मैं रणनीति के बारे में सवाल समझ गया हूं, लेकिन आमतौर पर * .pc फ़ाइलों को घोषित करने के लिए बिल्ड सिस्टम में एक तंत्र है या आप केवल 'pkg-config --cflags libname' के आउटपुट को प्रतिस्थापित कर सकते हैं कमांड लाइन। – milton

0

हेडर के लिए कंपाइलर के झंडे के बारे में त्रुटियों के लिए बहुत दुर्लभ है या इसे उस शीर्षलेख में हल करना बहुत आसान है (उदाहरण के लिए #ifdef .. # endif का उपयोग करके या पुनः- एक अधिक स्वागत ज्ञात पैटर्न का उपयोग कर कोड का एक हिस्सा लिखें)।

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

इसलिए इस मानदंडों का परीक्षण करने के लिए पुस्तकालय के स्रोत कोड में देखें (जो आप कहते हैं कि यह सही ढंग से संकलित है)। देखें कि मुख्य में फ़ाइल शामिल करने से पहले क्या शामिल है और आप पाएंगे कि आपकी शामिल फ़ाइल उस फाइल को शामिल करने में निर्भर है जिसमें इससे पहले शामिल है।

उदाहरण के लिए एमएसवीसी और जीसीसी दोनों में आप प्रीकंपिल्ड हेडर का उपयोग कर सकते हैं और प्रीकंपिल्ड हेडर में शामिल किसी भी अन्य स्रोत फ़ाइलों में स्वचालित रूप से शामिल किया जाएगा, इसलिए यदि आप अपने सार्वजनिक हेडर में से किसी एक में कुछ जोड़ना भूल जाते हैं और शामिल करना चाहते हैं यह आपके प्रीकंपिल्ड हेडर में आपका कोड सही ढंग से संकलित किया जाएगा, लेकिन अगर कोई आपके सार्वजनिक हेडर को शामिल करता है तो उसे एक त्रुटि मिल जाएगी।

या यदि आप private_header_1.h में कुछ परिभाषित करते हैं और इसे अपने सार्वजनिक शीर्षलेख में और फिर अपनी स्रोत फ़ाइल में उपयोग करते हैं (उदाहरण के लिए impl.cpp आप कहते हैं: # शामिल "private_header_1।ज " #include" public_header.h " फिर अपना कोड सही तरीके संकलित किया जाएगा लेकिन एक और कोड में public_header.h सहित एक त्रुटि बढ़ा देंगे

+0

मैं #ifdef ... # endif और कोड के पुनः लिखने वाले हिस्सों का उपयोग करने से बचना पसंद करूंगा। मुझे लगता है कि आपको हेडर समावेशन के आदेश के साथ एक अच्छा बिंदु मिला है, मुझे लगता है कि चीजें भी गलत हो सकती हैं। हालांकि मैं संकलक झंडे से संबंधित समस्याओं को हल करने में वास्तव में अधिक रुचि रखता हूं। और मैं प्रीकंपील्ड हेडर के बारे में कुछ अनिश्चित हूं: वे कैसे काम करते हैं, चाहे वे एक अच्छी पसंद हो ... – DevBen

+0

@ डेफ 7 प्रीकंपिल्ड हेडर बहुत प्यारे हैं, वे निर्माण समय को काफी कम कर सकते हैं। आप पीएच में स्थिर हेडर (जैसे सिस्टम हेडर या मानक सी ++ हेडर) शामिल करेंगे और फिर कंपाइलर उन्हें संकलित करेगा प्रत्येक सी ++ इकाई में केवल एक बार संकलित नहीं करेगा और यह एमएसवीसी और जीसीसी दोनों में बहुत अच्छा काम करेगा। लेकिन यहां मैं #ifdef .. # endif या pch का उपयोग नहीं करने के लिए कहता हूं, इसके बजाय मैं कहता हूं कि लाइब्रेरी में पीएच या अमान्य में ऑर्डर शामिल है जो समस्या का कारण बनता है – BigBoss

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