2012-01-27 3 views
6

यहाँ मेरी पुस्तकालय Lib.c फ़ाइल हैकमांड लाइन पर Win32 DLL के विरुद्ध बनाने और फिर लिंक करने के लिए सही कदम क्या हैं?</p> <pre><code>#include <stdio.h> int helloworld(){ printf("Hello World DLL"); } </code></pre> <p>यहाँ मेरी exe <code>Main.c</code> फ़ाइल है:

int helloworld(); 


int main(int argc, char** argv){ 
    helloworld(); 
} 

मैं Lib.dll बनाना चाहेंगे, और Main.exe, जहां Lib.dllLib.dll के खिलाफ Lib.c और Main.exe लिंक से आता है।

इसे प्राप्त करने के लिए विशिष्ट कदम क्या हैं?

+1

यदि आप एक डीएलएल बनाना चाहते हैं, तो उसे एक डेलमेन –

+3

@ माइककवान की आवश्यकता है: डेलमेन [वैकल्पिक] है (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs .85% 29.aspx) – tinman

+0

इस विषय पर इतने सारे ट्यूटोरियल हैं, मैं वास्तव में नहीं जानता कि हमें आपके लिए Google से क्यों परेशान करना है। – karlphillip

उत्तर

16

डीएलएल बनाने के तरीके पर 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 तर्क लिंकर कमांड लाइन पर पारित कर रहे हैं के रूप में वे दिखाई देते हैं, तो बस एक फ़ाइल नाम के रूप में यह करने के लिए अतिरिक्त इनपुट के रूप में प्रयोग किया जाता है निष्पादन योग्य में लिंक। इस मामले में जब हम डीएलएल बनाते हैं तो हम उत्पन्न लाइब्रेरी निर्दिष्ट करते हैं।

मैंने जो कमांड लाइनें यहां दिखाए हैं, वे बहुत कम हैं जो आपको चाहिए, लेकिन यह आपको एक डीएलएल बनाने और एप्लिकेशन को लिंक करने की अनुमति देगा।

मैंने माना है कि उपरोक्त सभी में कॉलिंग सम्मेलन सही है और मैंने यह देखने के लिए बहुत कुछ प्रयोग नहीं किया है कि मुझे किसी भी समय यह गलत लगता है या नहीं।

+0

आपको इस तथ्य के बारे में अधिक स्पष्ट होना चाहिए कि .dll बनाने से एक ही समय में एक .lib बनाता है। –

+0

यह उत्तर अच्छा है। यदि आप '__declspec' एक्सटेंशन का उपयोग करना पसंद नहीं करते हैं, तो आप एक [मॉड्यूल परिभाषा फ़ाइल] [http://msdn.microsoft.com/en-us/library/28d6s79h (v = vs.100) बना सकते हैं .aspx] जो निर्यातित इंटरफ़ेस निर्दिष्ट करता है। यह बाहरी नियंत्रण के बारे में (और कैसे) पर अधिक नियंत्रण दे सकता है। –

+1

आप शायद निर्यात किए गए प्रतीकों के लिए 'बाहरी "सी'' का उपयोग करना चाहते हैं, और शायद '__stdcall' (या' WINAPI' मैक्रो) भी। –

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