2010-09-28 15 views
5

मेरे पास सी में लिखा गया एक फ़ंक्शन है (HelloWorld.c फ़ाइल में कहें)। मैं इसे संकलित करना चाहता हूं और एक स्टेक ऑब्जेक्ट फ़ाइल बनाने की आवश्यकता है HelloWorld.aमैं एक स्थिर सी ऑब्जेक्ट फ़ाइल को पर्ल से कैसे लिंक करूं?

अंत में मुझे इसे एक पर्ल प्रोग्राम (HelloWorld.pl) से कॉल करने की आवश्यकता है।

+2

[मैं पर्ल में .a लाइब्रेरी फ़ाइलों को कैसे एक्सेस कर सकता हूं?] (Http: // stackoverflow।कॉम/क्यू/3733346) – daxim

+0

यदि आप सिर्फ कुछ सी कोड को पर्ल से चलाना चाहते हैं, तो इसे एक स्टैंडअलोन सी प्रोग्राम के रूप में संकलित करना और इसे कमांड लाइन पर कॉल करना काम कर सकता है :) या शायद गियरमैन की तरह कुछ उपयोगी हो सकता है .. –

उत्तर

9

पर्ल से सी तक कॉल करने के लिए आम तौर पर एक साझा, स्थिर नहीं, उसके सी कोड से लाइब्रेरी को संकलित करता है, और उसके बाद XSLoader या DynaLoader मॉड्यूल का उपयोग करके पर्ल दुभाषिया में लोड करता है।

तब पीएलएल स्पेस से सी कोड को कॉल करने में सक्षम होने के कई तरीके हैं। सबसे आम बात XSUB एस नामक कुछ लिख रही है, जिसमें एक पर्ल-साइड इंटरफेस है, सी कॉलिंग-कॉन्वेंटेंस के लिए पर्ल कॉलिंग-कॉन्वेंटेंस को मैप करें, और सी फ़ंक्शंस को कॉल करें। वे XSUBs आमतौर पर साझा लाइब्रेरी में भी जुड़े होते हैं जिन्हें पर्ल में लोड किया जाएगा, और एक्सएस नामक एक भाषा में लिखा जाएगा, जिसे व्यापक रूप से perlxs और perlxstut में दस्तावेज किया गया है।

उस रैपर परत को बनाने के अन्य तरीके भी हैं, जैसे विभिन्न एक्सएस कोड जनरेटर, साथ ही साथ SWIG। लेकिन आप सीधे NCI का उपयोग कर सी कार्यों को भी कॉल कर सकते हैं। पर्ल में भी उनमें से कई हैं। P5NCI उन लोगों का एक उदाहरण है, इस साल के Google ग्रीष्मकालीन कोड कार्यक्रम में विकसित सीटीपीएस मॉड्यूल एक और है।

शायद एक और संबंधित तकनीक जिसका उल्लेख यहां किया जाना चाहिए Inline::C, और इनलाइन परिवार के अन्य मॉड्यूल हैं। वे आपको सीधे अन्य भाषाओं में कोड लिखने की अनुमति देते हैं, और इसे कॉल करते हैं। हुड इनलाइन :: सी के तहत बस एक्सएस कोड बनाता है और इसका परिणाम दुभाषिया में लोड करता है।

3

जैसा कि @rafl कहता है, आपको साझा लाइब्रेरी का उपयोग करना चाहिए।

यदि आपको एक स्थिर पुस्तकालय का उपयोग करना होगा, तो आपको पर्ल को निर्मित स्थिर पुस्तकालय के साथ पुनर्निर्माण करना होगा। आपको कुछ एक्सएस गोंद भी चाहिए। हालांकि, यह इतना गन्दा है कि आप वास्तव में, वास्तव में ऐसा नहीं करना चाहते हैं।

2

perlxstut के अनुसार:

आम तौर पर यह माना जाता है कि अगर एक प्रणाली गतिशील रूप से एक लाइब्रेरी लोड करने की क्षमता नहीं है, आप XSUBs का निर्माण नहीं कर सकते। यह गलत है। आप उन्हें बना सकते हैं, लेकिन आपको XSUBs subroutines को शेष पर्ल के साथ लिंक करना होगा, जो एक नया निष्पादन योग्य बना देगा। यह स्थिति पर्ल 4 के समान है।

यह ट्यूटोरियल अभी भी इस तरह के सिस्टम पर उपयोग किया जा सकता है। XSUB बिल्ड मैकेनिज्म सिस्टम की जांच करेगा और यदि संभव हो तो गतिशील रूप से लोड करने योग्य लाइब्रेरी का निर्माण करेगा, या फिर एक स्थिर लाइब्रेरी और फिर, वैकल्पिक रूप से, उस स्थिर लाइब्रेरी के साथ एक नया स्थैतिक रूप से लिंक किया गया निष्पादन योग्य।

क्या आप बनाना चाहते हैं एक सिस्टम पर एक स्थैतिक रूप से जुड़े निष्पादन योग्य जो पुस्तकालयों को गतिशील रूप से लोड कर सकता है, आप निम्न सभी उदाहरणों में, जहां "make" आदेश को बिना तर्क के निष्पादित किया गया है, कमांड को "make perl" आदेश चलाएं।

यदि आपने पसंद के अनुसार इस तरह के एक स्थिर रूप से जुड़े निष्पादन योग्य उत्पन्न किया है, तो "make test" कहने के बजाय, आपको "make test_static" कहना चाहिए। उन प्रणालियों पर जो गतिशील रूप से लोड करने योग्य पुस्तकालयों का निर्माण नहीं कर सकते हैं, बस "make test" पर्याप्त है।

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