डीएलएल बनाने के तरीके पर this संबंधित प्रश्न देखें।
आपका लाइब्रेरी कोड जो खड़ा है, वह किसी भी प्रतीक को निर्यात नहीं करता है और आपका निष्पादन योग्य आपकी लाइब्रेरी से प्रतीकों को आयात नहीं करता है। ऐसा करने के लिए दो सामान्य पैटर्न नीचे दिखाए गए हैं लेकिन आप पहले उस पर पढ़ना चाहेंगे।
पहली विधि कोड में घोषित करने के लिए __declspec()
का उपयोग करती है कि आपके डीएलएल से कौन से फ़ंक्शंस (या अन्य आइटम) निर्यात किए जाते हैं और अन्य निष्पादन योग्य द्वारा आयात किए जाते हैं। आप एक हेडर फाइल का उपयोग निर्यात आइटम घोषित करने और एक पूर्वप्रक्रमक नियंत्रित करने के लिए प्रतीकों का निर्यात या आयात कर रहे हैं कि क्या इस्तेमाल किया ध्वज के लिए:
mylib.h:
#ifndef MYLIB_H
#define MYLIB_H
#if defined(BUILDING_MYLIB)
#define MYLIB_API __declspec(dllexport) __stdcall
#else
#define MYLIB_API __declspec(dllimport) __stdcall
#endif
#ifdef __cplusplus
extern "C" {
#endif
int MYLIB_API helloworld(void);
#ifdef __cplusplus
}
#endif
#endif
मैं भी विशेष रूप से करने के लिए बुला सम्मेलन की स्थापना की है __stdcall
अधिकांश डीएलएल फ़ंक्शंस हैं (यदि मैंने विंडोज़ शामिल किया था तो __stdcall
के बजाय का उपयोग किया हो सकता था) और कार्यों को extern "C"
के रूप में घोषित कर दिया है, इसलिए उनके नाम C++ के रूप में संकलित होने पर उलझन में नहीं आते हैं। यहां कोई समस्या नहीं है क्योंकि यह सभी सी है, लेकिन यदि आप सी स्रोत से डीएलएल बनाना चाहते हैं और फिर इसे C++ निष्पादन योग्य से उपयोग करने का प्रयास करें तो आयातित नाम गलत होंगे।
कोड तो ऐसा दिखाई दे सकता:
mylib.c
#include "mylib.h"
#include <stdio.h>
int MYLIB_API helloworld(void)
{
printf("Hello World DLL");
return 42;
}
आप निम्न कमांड लाइन का उपयोग कर अपने DLL का निर्माण चाहते हैं। साथ ही DLL यह आयात पुस्तकालय (उदारीकरण) एक और निष्पादन से अपने DLL उपयोग करने की आवश्यकता पैदा करेगा बनाने (और साथ ही निर्यात फ़ाइल, लेकिन वह केवल certain circumstances में आवश्यक है) के रूप में:
cl /DBUILDING_MYLIB mylib.c /LD
/DBUILDING_MYLIB
तर्क प्रीप्रोसेसर प्रतीक को परिभाषित करता है ताकि यह नियंत्रित किया जा सके कि डीएलएल में कार्य निर्यात (यदि यह परिभाषित किया गया है) या आयात (परिभाषित नहीं किया गया है)। इसलिए आप इसे डीएलएल बनाने के दौरान परिभाषित करेंगे लेकिन आपके आवेदन के निर्माण के दौरान नहीं।
/LD
पैरामीटर डीएलएल का उत्पादन करने के लिए सीएल को बताता है।
दूसरी विधि टिप्पणियों में उल्लिखित module definition files का उपयोग करना है। आप पहले से मौजूद कोड का उपयोग कर सकते हैं लेकिन आपको मॉड्यूल परिभाषा फ़ाइल बनाने की भी आवश्यकता है।
cl /LD mylib.c /link /DEF:mylib.def
तब आप अपने आवेदन कोड सकता है इतना है कि यह साथ अपने पुस्तकालय हेडर प्रयोग किया है: DLL आप निम्नलिखित कमांड लाइन की आवश्यकता होती है निर्माण करने के लिए इस मामले में
LIBRARY mylib
EXPORTS
helloworld
: यह इस तरह दिखता है पर यह सबसे सरल है अपने DLL समारोह के आयातित संस्करण:
main.c
/* No need to include this if you went the module definition
* route, but you will need to add the function prototype.
*/
#include "mylib.h"
int main(void)
{
helloworld();
return (0);
}
जो आप निम्न कमांड लाइन के साथ संकलित कर सकते हैं (मानते हैं कि DLL निर्माण से आयात लाइब्रेरी आपके मुख्य.c के समान निर्देशिका में है)। यह कदम एक ही है कि क्या आप declspec या मॉड्यूल परिभाषा फ़ाइलों का उपयोग किया: पारित कर दिया
cl main.c /link mylib.lib
तर्क के बाद /link
तर्क लिंकर कमांड लाइन पर पारित कर रहे हैं के रूप में वे दिखाई देते हैं, तो बस एक फ़ाइल नाम के रूप में यह करने के लिए अतिरिक्त इनपुट के रूप में प्रयोग किया जाता है निष्पादन योग्य में लिंक। इस मामले में जब हम डीएलएल बनाते हैं तो हम उत्पन्न लाइब्रेरी निर्दिष्ट करते हैं।
मैंने जो कमांड लाइनें यहां दिखाए हैं, वे बहुत कम हैं जो आपको चाहिए, लेकिन यह आपको एक डीएलएल बनाने और एप्लिकेशन को लिंक करने की अनुमति देगा।
मैंने माना है कि उपरोक्त सभी में कॉलिंग सम्मेलन सही है और मैंने यह देखने के लिए बहुत कुछ प्रयोग नहीं किया है कि मुझे किसी भी समय यह गलत लगता है या नहीं।
यदि आप एक डीएलएल बनाना चाहते हैं, तो उसे एक डेलमेन –
@ माइककवान की आवश्यकता है: डेलमेन [वैकल्पिक] है (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs .85% 29.aspx) – tinman
इस विषय पर इतने सारे ट्यूटोरियल हैं, मैं वास्तव में नहीं जानता कि हमें आपके लिए Google से क्यों परेशान करना है। – karlphillip