c++ कहाँ शामिल सी++/सी हेडर फाइल का कार्यान्वयन है?




सी++ प्रोग्राम्स (4)

यह थोड़ा बेवकूफ लग सकता है :) लेकिन यह थोड़ी परेशान कर रहा है। जब मैं कुछ शीर्ष लेख फ़ाइलें शामिल करता हूं जो मेरे सी ++ / सी प्रोग्राम में अन्य लोगों द्वारा लिखी जाती हैं, तो कैसे संकलक जानता है कि हेडर फाइलों में घोषित क्लास सदस्य फ़ंक्शन का कार्यान्वयन कहां है?

कहो कि मैं कुछ प्रोग्राम लिखना चाहता हूं जो ओपनसीवी लाइब्रेरी का लाभ उठाता है। आम तौर पर मैं इसका उपयोग करना चाहूंगा:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

हालांकि, ये सिर्फ हेडर फाइल हैं, जो कि जहां तक ​​मैं बता सकता हूं, केवल फ़ंक्शन घोषित करता है, लेकिन कार्यान्वयन के बिना। तो कैसे संकलक जानता है कि कार्यान्वयन कहाँ से पता चलता है? खासकर जब मैं एक .so फ़ाइल का निर्माण करना चाहता हूं।

एक समान पोस्ट है मूल रूप से यह कहा गया था कि त्रिज्या-पार्टी लाइब्रेरी, विशेष वाणिज्यिक उत्पाद स्रोत कोड रिलीज़ नहीं करते हैं, इसलिए वे शीर्ष लेख के साथ लिप फ़ाइल को जहाज करते हैं। हालांकि, यह स्पष्ट नहीं किया कि कंपाइलर को कैसे पता चलता है कि लिब फ़ाइल कहां से है। इसके अलावा, उस पोस्ट में दिए गए उत्तर में अगर मैं अपना खुद का कोड संकलित करना चाहता हूं, तो मुझे उस हेडर फाइल के कार्यान्वयन के स्रोत कोड की आवश्यकता होगी। क्या इसका मतलब है कि मैं कार्यान्वयन के स्रोत के बिना एक .so फ़ाइल का निर्माण नहीं कर सकता?


कंपाइलर टूलचैन में कम से कम दो प्रमुख टूल होते हैं: कंपाइलर और लिंक एडिटर (यह पूरी श्रृंखला संकलक के नाम से बहुत आम है, लेकिन कड़ाई से बोलना गलत है)।

कंपाइलर उपलब्ध स्रोत कोड से ऑब्जेक्ट कोड के उत्पादन के प्रभार में है। उस चरण में कंपाइलर को पता है कि मानक हेडर्स कहां स्थित हैं, और हेडर का पता लगाने के लिए गैर-मानक डायरों का इस्तेमाल करने के लिए कहा जा सकता है। उदाहरण के लिए, gcc का उपयोग करता -I आपको कुछ और वैकल्पिक डायरों को निर्दिष्ट करने के लिए हेडर शामिल कर सकते हैं।

लिंक एडिटर ऑब्जेक्ट कोड से एक्जीक्यूटेबल फाइल्स (इसका मूल सामान्य उपयोग) बनाने के प्रभारी है। निष्पादन योग्य बनाने के लिए उसे संकलित समय पर घोषित चीज़ों के हर कार्यान्वयन को खोजने की आवश्यकता होती है, जिसके लिए आपने स्रोत कोड नहीं दिया था। ये अन्य ऑब्जेक्ट कोड, पुस्तकालयों में ऑब्जेक्ट कोड आदि हो सकते हैं। लिंक संपादक जानता है कि मानक पुस्तकालय कहाँ स्थित हैं और आपको गैर-मानक डायर निर्दिष्ट करने के लिए कहा जा सकता है। उदाहरण के लिए आप एलसी के साथ वैकल्पिक डायरों का उपयोग करने के लिए gcc टूलचैन को बता सकते हैं जिसमें लाइब्रेरी हो सकती है आपको पता हो सकता है कि लिंक संस्करण अब आम तौर पर एक दो चरण की प्रक्रिया है: लिंक-टाइम पर स्थान-और-नाम-रिज़ॉल्यूशन और रन-टाइम पर वास्तविक लिंक-संस्करण (डायनामिक लाइब्रेरी बहुत आम हैं)।

मूल रूप से एक लाइब्रेरी ऑब्जेक्ट कोड का एक संग्रह है। इंटरनेट से परामर्श करें कि आप ऑब्जेक्ट कोड के स्रोत कोड से पुस्तकालयों को कैसे आसानी से बना सकते हैं।


सामान्य तौर पर, कार्यान्वयन पूर्व-संकलित पुस्तकालयों के रूप में वितरित किया जाता है। आपको कंपाइलर को कहें कि वे कहां स्थित हैं।

उदाहरण के लिए, gcc के लिए, ऑनलाइन मैनुअल का हवाला देते हुए

-llibrary
-l library

लिंक करते समय पुस्तकालय नामक पुस्तकालय खोजें। [...]

तथा,

-Ldir

-l लिए खोजी जाने वाली निर्देशिकाओं की सूची में निर्देशिका डाइर जोड़ें

नोट: आपको मानक पुस्तकालयों को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है, वे स्वचालित रूप से जुड़े हुए हैं। बल्कि, यदि आप उन्हें बाइनरी से लिंक नहीं करना चाहते हैं, तो आपको -nostdlib विकल्प को पास करके संकलक को सूचित करना होगा।


जैसा कि अन्य लोगों ने पहले से ही समझाया है, आपको अपने कंपाइलर को यह बता देना होगा कि फाइलों को कहाँ देखना है इसका अर्थ है कि आपको पता होना चाहिए कि आपके कंपाइलर के लिए कौन सा पथ निर्दिष्ट है।

कुछ घटक एक तंत्र प्रदान करते हैं, जहां आपको सटीक पथ जानने की आवश्यकता नहीं होती है, लेकिन इसे अपने सिस्टम से स्वचालित रूप से पुनर्प्राप्त कर सकता है।

उदाहरण के लिए यदि आप जीटीके + 3 का उपयोग कर संकलन करना चाहते हैं तो आपको अपने कंपाइलर के लिए इन झंडे को निर्दिष्ट करना होगा:

सीएफएलएजी: = -आई ./ `pkg-config -cflags gtk + -3.0`

LIBS: = -lm `pkg-config -libs gtk + -3.0`

यह स्वचालित रूप से जीसीसी के लिए आवश्यक शामिल और पुस्तकालय पथ झंडे में परिणाम देगा।


सटीक जवाब प्लेटफॉर्म विशिष्ट है, लेकिन सामान्य तौर पर मैं कह सकता हूं कि कुछ लाइब्रेरी वास्तव में हैडर हैं, और अन्य में द्विआधारी ऑब्जेक्ट फाइलों में पुस्तकालय के तरीकों के कार्यान्वयन शामिल हैं। मेरा मानना ​​है कि ओपनसीवी दूसरी तरह का है, यानी ऑब्जेक्ट फाइलों में कार्यान्वयन प्रदान करता है, या तो गतिशील या स्थिर लिंकिंग के लिए, और उनके विरुद्ध आपके कार्यक्रम लिंक। यदि आपका निर्माण कार्य करता है, तो यह उन पुस्तकालयों के विरुद्ध लिंक करने के लिए पहले से ही कॉन्फ़िगर किया गया है। इस बिंदु पर विवरण बहुत ज्यादा मंच बन गया है और बिल्ड-सिस्टम विशिष्ट है।

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





libraries