2010-04-17 13 views
9

मेरे पास वर्तमान में एक कंसोल प्रोजेक्ट है जो एक .exe फ़ाइल बनाता है; मैं इसे एक .lib फ़ाइल भी बनाना चाहता हूं, इसलिए अन्य परियोजनाएं, जो डीएलएल के रूप में संकलित हैं, मूल परियोजना से कार्यों को कॉल करने में सक्षम होंगे।मैं विजुअल सी ++ में एक .lib फ़ाइल और एक .exe फ़ाइल दोनों कैसे बना सकता हूं?

मुझे पता है कि यह संभव है, लेकिन मुझे यह नहीं पता कि यह कैसे किया जाए। मैं लिंकर को एक .lib को लिंक करने के लिए कैसे कहूं?

उत्तर

8

सामान्य रूप से यह संभव नहीं है - स्थिर पुस्तकालय और निष्पादन योग्य जानवरों के विभिन्न प्रकार हैं। इस स्थिति को संभालने का तरीका दो परियोजनाओं को बनाना है - पुस्तकालय के लिए एक, जिसमें सभी कार्यक्षमताएं शामिल हैं। और निष्पादन योग्य के लिए एक, जो एक पतली आवरण है जो पुस्तकालय में केवल कार्यों को कॉल करता है।

+0

लेकिन यहां पर मेरे पास एक वीसीप्रोज़ फ़ाइल है जो एक exe और lib दोनों के साथ समाप्त होती है ... फिर भी मेरे जीवन के लिए मुझे क्या नहीं मिला यह ऐसा करता है। http://svn.corecraft.org/aspire_mirror/trunk/win/VC90/hearthstone-world.vcproj – MoshiBin

+0

@ स्पीडी संभवतः इस परियोजना में दो उप-परियोजनाएं हैं। –

+0

सहमत हुए। Exe प्रोजेक्ट को lib प्रोजेक्ट पर निर्भर करें और आवश्यकता होने पर इसे स्वचालित रूप से पुनः संयोजित कर दिया जाएगा। –

0

आप "lib को भी लिंक नहीं करते", आप एक स्थिर लाइब्रेरी प्रोजेक्ट बनाते हैं। उत्तरार्द्ध लिंकर को बिल्कुल कॉल नहीं करता है - इसके बजाय यह आपकी सभी फ़ाइलों को cl /c के साथ संकलित करता है और परिणामस्वरूप एस को lib.exe का उपयोग करके lib में जोड़ता है।

2

एक आवेदन (.exe) परियोजना में किसी भी प्रतीक निर्यात किया जाता है तो (जैसे __declspec (dllexport) के साथ), दोनों .exe और उदारीकरण फ़ाइलें उत्पन्न हो जाएगा देखें: Why does my Visual C++ .exe project build create .lib and .exp files?

+0

यह सही w.r.t. है शीर्षक में सवाल।हालांकि, यह शरीर में दूसरे प्रश्न के साथ कैसे मदद करेगा; "मूल [EXE] प्रोजेक्ट से फ़ंक्शंस कॉल करने में सक्षम हो"? – MSalters

+0

आप जेनरेट किए गए .lib के खिलाफ लिंक करते हैं; .exe एक डीएलएल के रूप में व्यवहार करता है। यानी .exe से रनटाइम पर प्रतीकों को लोड किया जाता है। –

+0

मैंने अंतिम टिप्पणी में जो लिखा है उसका परीक्षण किया। यह कभी-कभी काम करता है और कभी-कभी नहीं करता है, "एप्लिकेशन (0xC0000005)" त्रुटि प्रारंभ नहीं कर सकता है। लोड लाइब्रेरी और GetProcAddress का उपयोग करके मैं स्मृति समस्याओं के साथ भी समाप्त होता हूं। तो वास्तव में मुझे नहीं पता कि जेनरेट किए गए .lib का सही तरीके से उपयोग कैसे करें। –

11

यह सिर्फ पोस्ट करना एक संदर्भ के रूप में मुझे पता है कि मूल पोस्ट बहुत समय पहले पोस्ट किया गया था लेकिन यह अभी भी किसी भी व्यक्ति पर लागू होता है जिसकी इस समस्या के समाधान की आवश्यकता है।

  1. सही परियोजना पर क्लिक करें:

    परियोजना पर जाएं आप के लिए एक उदारीकरण फ़ाइल बनाने के लिए और इन चरणों का पालन करना चाहते हैं।

  2. गुण चुनें।
  3. बिल्ड ईवेंट का चयन करें।
  4. प्री-लिंक ईवेंट का चयन करें।
  5. अंत में कमांड लाइन में इस पेस्ट:

    @ECHO ON @ECHO "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj" "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"

यह उत्पन्न वस्तु फ़ाइलों से बाहर lib फ़ाइल उत्पन्न करने के लिए lib उपकरण कॉल करेंगे।

+0

देर से, लेकिन वैसे भी आपको धन्यवाद देना चाहता था :) आपने अभी अपना जीवन बहुत आसान बना दिया है –

+0

आपका स्वागत है। ;) –

+0

मेरे मामले में .obj के लिए डिफ़ॉल्ट लोकेशन प्रोजेक्ट फ़ोल्डर में था, इसलिए मैंने "$ (इंटरमीडिएटऑटपुटपैथ) *। Obj" से "$ (SolutionDir) $ (ProjectName) \ $ (कॉन्फ़िगरेशन) \ *। Obj" । यह ठीक काम करता है, धन्यवाद। – elarmando

0

यह आश्चर्यजनक है कि कितने योगदानकर्ता गलत जवाब के बारे में जोर देते हैं, जब वे बस उत्तर नहीं जानते हैं।

अपने .exe जगह पूर्व लिंक इवेंट में निम्न पंक्ति के साथ जुड़े एक उदारीकरण बनाने के लिए:

"$ (VC_ExecutablePath_x86) \ lib.exe"/बाहर: "$ (OutDir) $ (ProjectName) .lib "" $ (इंटरमीडिएटऑटपुटपैथ) *। obj "

+0

यह तकनीक केवल डीबग मोड में काम करने के लिए प्रतीत होती है। – user6664090

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