2009-07-15 17 views
26

का उपयोग कर विंडोज़ में कमांड लाइन से डीएलएल कैसे बनाया जाए, मैं लगभग 20 वर्षों तक सी कर रहा हूं लेकिन मैंने कभी डीएलएल नहीं बनाया है; मैंने हमेशा स्टेटिक लिंक को पसंद किया है।एमएसवीसी

मैं अपने विंडोज अनुप्रयोगों को बनाने के लिए कमांड लाइन - cl.exe, आदि - और gnumake makefiles का उपयोग करता हूं।

अब मैं एक डीएलएल बनाना चाहता हूं और मैं उलझन में हूं।

आखिरकार, मैं एक .lib और a .dll दोनों के साथ समाप्त हो जाऊंगा। .lib में स्टब कोड होता है जो रन टाइम पर डीएलएल लोड करता है और उसमें कोड का उपयोग करता है।

मैं lib और लिंक के लिए कमांड लाइनों को देख रहा हूं और यह मेरे लिए यह स्पष्ट नहीं है कि इस आउटपुट का उत्पादन करने के लिए क्या किया जाना चाहिए।

तो मेरे कुछ प्रश्न हैं;

क्या सीएल को किसी भी अतिरिक्त तर्क की आवश्यकता है, यह इंगित करने के लिए कि यह एक डीएलएल के लिए संकलित है? (मुझे पता है कि डीएलएल निर्यात किए गए प्रोटोटाइपों को __declspec (dllexport) की आवश्यकता है)।

मुझे एक तर्क के रूप में लिंक जरूरत/डीएल पता है।

क्या मैं क्रमशः .lib और .dll का उत्पादन करने के लिए lib और लिंक चलाऊंगा, या दोनों को उत्पादित कर दूंगा?

मुझे और क्या जानने की आवश्यकता है?

+2

यह ब्लॉग पोस्ट सीधा है, और यहां तक ​​कि 'cty दिखाता है पायथन से पायस का उपयोग: http://albertech.blogspot.com/2014/12/how-to-compile-dll-using-clexe.html – jar

उत्तर

3

बाहर निकलता है यह स्वचालित रूप से होता है।

यदि आपने फ़ंक्शंस निर्यात किया है (उदा।/निर्यात, __declspec (dllexport), आदि) लिंकर स्वचालित रूप से .lib फ़ाइल उत्पन्न करेगा (आपको निश्चित रूप से लिंकर कमांड लाइन पर/dll की आवश्यकता है)।

+0

वास्तव में, यह एक मॉड्यूल परिभाषाओं फ़ाइल का उपयोग करने, क्योंकि वह, __declspec (dllexport) के बिना प्रोटोटाइप उपयोग करने के लिए है जो बदले में dll के मूल हेडर फाइल का उपयोग करने की अनुमति देता आप की अनुमति देता है सबसे अच्छा है आप ' –

0

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

+1

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

+0

सच है, लेकिन आप इससे अधिक सटीक नहीं हो सकते हैं। यदि आप वीएम का उपयोग करते हैं तो आप कुछ भी बर्बाद नहीं करेंगे, लेकिन हाँ, इसमें और भी समय लगता है। :) सादर, Sebastiaan –

30

कमांड लाइन उपयोग पर:

cl.exe /LD <files-to-compile> 

या, यदि आप और अधिक वर्बोज़ & स्पष्ट संस्करण पसंद करते हैं:

cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll 
+0

धन्यवाद' - प्रोजेक्ट बनाने के लिए एमएसवीसी का उपयोग किए बिना विंडोज़ "_D" एस को जानना संभव नहीं है। –

+2

आईएमएचओ, '_USRDLL' और' _WINDLL' की आवश्यकता नहीं है, बस '/ ll' के बिना'/lL' '/ ll' का उपयोग करें,'/link' लिंकर से '/ link'। – nn0p

+0

कुडोस @ nn0p पर जाएं - आपको * वास्तविक दस्तावेज * सीएल के साथ डीएलएल संकलन करने के लिए स्विच मिला है; इबो हॉल द्वारा मूल "समाधान" तुलना आईएमओ में एक कच्चे हैक की तरह लगता है। – vaxquis

1

करता सीएल किसी भी अतिरिक्त तर्क की जरूरत है, इंगित करने के लिए यह संकलन है एक डीएलएल के लिए? (मुझे पता है कि डीएलएल निर्यात किए गए प्रोटोटाइपों को __declspec (dllexport) की आवश्यकता है)।

नहीं के बाद से Win3x दूर चला गया, अब तुम सिर्फ बस या तो __declspec(dllexport) या एक .def फ़ाइल जो प्रतीकों आप निर्यात के नाम को परिभाषित करता है की जरूरत है। एक .def फ़ाइल आपको संशोधित नामों के साथ प्रतीकों को निर्यात करने की अनुमति देती है, इसलिए यह अभी भी विशेष मामलों के लिए उपयोगी हो सकती है।

मुझे एक तर्क के रूप में लिंक की जरूरत/डीएल पता है।

हाँ।

क्या मैं क्रमशः .lib और .dll का उत्पादन करने के लिए lib और लिंक चलाऊंगा, या दोनों को उत्पादित कर दूंगा?

lib केवल स्थिर पुस्तकालयों बनाने के लिए (या अपने implib को .objs जोड़ने के लिए) लिंक दोनों एक .dll और इसके लिए एक आयात उदारीकरण का उत्पादन करेगा प्रयोग किया जाता है।

2

Ebow Halm का जवाब देने के लिए simlar, लेकिन निर्यात कार्य करता है और नए आदेश पंक्ति तर्क लिस्टिंग के लिए एक .def फ़ाइल का उपयोग करते हुए:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def 

संदर्भ:

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