2011-01-10 21 views
7

e.exe मेरी कस्टम स्थैतिक लाइब्रेरी, c.lib के विरुद्ध जुड़ा हुआ है, जो w.dll में परिभाषित Win32 API का उपयोग करता है। w.dll सी: \ विंडोज \ System32 में स्थित है और इसकी आयात लाइब्रेरी w.lib है, जो विंडोज एसडीके निर्देशिका में स्थित है। शैल w.libअतिरिक्त निर्भरताc.lib या e.exe प्रोजेक्ट में सूचीबद्ध किया गया हो? (e.exe दोनों मामलों में सफलतापूर्वक बनाता है।) सबसे अच्छा अभ्यास क्या है और क्यों? मुझे लगता है कि e.exe को w.lib के बारे में पता नहीं होना चाहिए।निर्भरता वाले स्टेटिक लाइब्रेरी

c.lib केवल डेवलपर्स के समूह के बीच साझा किया जाना है (ग्राहकों को नहीं भेजा जाना चाहिए)।

टेस्ट: मैं VS2008 का इस्तेमाल किया और उपयोगिता DUMPBIN दोनों ही मामलों परिणामों का परीक्षण और यहाँ हैं करने के लिए:

  • केस 1: w.libc.lib परियोजना में अतिरिक्त निर्भरताके रूप में जोड़ा।

dumpbin /archivemembers c.lib उत्पादन सूचियों पुरालेख सदस्यों के रूप में c.lib परियोजना से w.dll में दोनों ऑफसेट और .obj फ़ाइलें।

  • केस 2:,

इस बार DUMPBIN उत्पादन c.lib का केवल .obj फ़ाइलें हैं और c.lib के आकार से छोटी है: w.lib नहीं c.lib में लेकिन e.exe परियोजना में अतिरिक्त निर्भरता के रूप में जोड़ा केस 1

में (c.libमें अतिरिक्त निर्भरता रूप में जोड़ा गया दोनों ही मामलों मेंपरियोजना)

नोट:। मैं w.lib और w.dll यहाँ काल्पनिक रूप में, सामान्य नाम विंडोज पुस्तकालयों के लिए इस्तेमाल किया, लेकिन वे जैसे हो सकता है Userenv.lib और Userenv.dll या Version.lib और Version.dll ...

उत्तर

1

मुझे लगता है कि आप गलत समझ रहे हैं कि संग्रह बनाने और आयात संग्रह क्या करता है।

एक संग्रह बनाना, जैसा कि आपने टिप्पणियों में सही ढंग से अनुमान लगाया है, संकलित .objs युक्त एक एकीकृत फ़ाइल बनाता है। अब, इसमें आपके द्वारा पसंद किया जाने वाला कोई भी कोड हो सकता है, जिसमें पुस्तकालयों को गतिशील कॉल तक सीमित नहीं है। एक आयात पुस्तकालय एक पुस्तकालय है जिसमें एक ओबीजे होता है जो विशेष रूप से ऐसी कॉल करता है, विचार यह है कि इसे आयात करके, आपका exe उचित प्रतीकों को ढूंढ सकता है (वे आपके द्वारा बनाए गए निष्पादन योग्य में होना चाहिए)।

w.lib से c.lib बनाने की प्रक्रिया बस w.lib की वस्तुओं को निकालता है और उन्हें c.lib में वस्तुओं के संग्रह करने के लिए जोड़ देता है। असल में, c.lib एक आयात लाइब्रेरी + कोड बन जाता है।

क्या मुझे लगता है कि आपको यह करना चाहिए? वास्तव में नहीं - यह भ्रम पैदा कर सकता है कि e.exe पर निर्भर करता है; मुझे लगता है कि आपको इसे छिपाने की कोशिश करने के बजाय स्पष्ट रूप से यह दृश्य दिखाना चाहिए। उस ने कहा, यह केवल एक सिफारिश है, एक नियम नहीं।

+0

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

+1

मैं इस जवाब से उलझन में हूं। पुस्तकालयों के शीर्ष पर पुस्तकालयों का निर्माण करना आम बात नहीं है? किसी भी विस्तारित पुस्तकालय को "आयात पुस्तकालय + कोड" माना जाएगा। मुझे लगता है कि पुस्तकालय के ब्योरे को छिपाने के लिए बेहतर अभ्यास है। – jwalk

0

पुस्तकालय जुड़े नहीं हैं, इसलिए किसी भी प्रोजेक्ट जो .lib का उपयोग करता है उसे भी इसकी निर्भरताओं की आवश्यकता होती है।

असल में .lib लिंकिंग के दौरान आपके exe को "कॉपी" कर रहे हैं।

यदि आप अपने उपयोगकर्ताओं को विस्फोट लिंक से दोबारा जोड़ने के लिए बाध्य करना चाहते हैं, तो एक डीएल में c.lib को बदलता है, डीएलएस जुड़े होते हैं और आपको निर्माण के दौरान उनकी निर्भरताओं की आवश्यकता नहीं होती है।

+0

मैं समझता हूं कि 'link.exe' बाहरी संदर्भों को हल नहीं करता है, लेकिन स्थिर पुस्तकालय बनाने के लिए बस 'obj' फ़ाइलों का एक सेट ज़िप करता है। मेरा प्रश्न संकलन समय में निर्भरताओं के बारे में था - केस 1 से पता चलता है कि 'e.exe' को' w.lib' के बारे में बिल्कुल पता नहीं था। बेशक, रनटाइम में 'w.dll' मौजूद होना चाहिए। –

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