2013-06-07 5 views
5

अद्यतन: यह सब अनिवार्य रूप से फर्जी है। यह मशीन पर Depends.exe का संस्करण दिखाता है जहां एप्लिकेशन चलाता है 32 बिट संस्करण था। इसे ठीक करने पर, मशीनें सिस्टम DLL को 64 बिट के रूप में दिखाती हैं, इसलिए यह समस्या का स्रोत नहीं है। यकीन नहीं है कि क्यों निर्भर करता है 32 बिट exe में उन्हें इस तरह से दिखाता है।QtCreator/MSVC 64 बिट सिस्टम DLL को मेरे 32 बिट एप्लिकेशन से लिंक क्यों कर रहा है?


और अद्यतन: आखिरकार समस्या एक 64 बिट डीएलएल थी। निर्भरता वॉकर के सही संस्करण का उपयोग करने के बाद यह खोजना आसान था। 32 बनाम 64 बिट संस्करण का चयन करना उस प्लेटफॉर्म पर आधारित नहीं है जिस पर आप चल रहे हैं। FAQ से:

निर्भरता वॉकर किसी भी 32-बिट या 64-बिट विंडोज मॉड्यूल के साथ काम करेगा। 32-बिट और 64-बिट संस्करण निर्भरता वॉकर हैं। सभी संस्करण 32-बिट और 64-बिट मॉड्यूल सक्षम या खोलने योग्य हैं। हालांकि, 32-बिट निर्भरता वॉकर का उपयोग करने के लिए 32-बिट मॉड्यूल और 64-बिट निर्भरता वॉकर को 64-बिट मॉड्यूल को संसाधित करने के लिए उपयोग करने के लिए प्रमुख फायदे हैं। विंडोज के 64-बिट संस्करण पर चलते समय यह विशेष रूप से सच है, जो 32-बिट और 64-बिट दोनों प्रोग्रामों को निष्पादित करने की अनुमति देता है। 64-बिट विंडोज़ (जिसे "WOW64" के नाम से जाना जाता है) पर 32-बिट उपप्रणाली का अपना निजी रजिस्ट्री, "ऐपपैथ", "ज्ञात डेल", सिस्टम फ़ोल्डर्स और मैनिफेस्ट प्रोसेसिंग है। निर्भरता वॉकर का केवल 32-बिट संस्करण इस 32-बिट वातावरण तक पहुंच सकता है, जिसे को 32-बिट मॉड्यूल को सटीक रूप से संसाधित करने की आवश्यकता होती है। इसी तरह, केवल निर्भरता के 123-बिट संस्करण वॉकर 64-बिट वातावरण को पूरी तरह से एक्सेस कर सकता है, इसलिए यह हमेशा होना चाहिए जो 64-बिट मॉड्यूल को प्रोसेस करने के लिए उपयोग किया जाता है।


मैं सही ढंग से एक मशीन पर और गलत तरीके से एक दूसरे पर आधारित है, एक आवेदन पत्र है। दोनों मैकबुक प्रो बूटकैम्प के माध्यम से विंडोज 7 चला रहे हैं। वे VS2010 के साथ संकलित/लिंक उपकरण के रूप में QtCreator के माध्यम से बनाए जा रहे हैं।

मशीन पर यह किसी भी रिपोर्ट किए गए त्रुटियों के बिना संकलित और लिंक करता है। हालांकि, जब इसे चलाया जाता है तो यह 0xc000007b त्रुटि (STATUS_INVALID_IMAGE_FORMAT) के साथ विफल रहता है। Depends.exe पुष्टि करता है कि exe 32-बिट exe है लेकिन सभी Windows DLLs (advapi32.dll आदि) को 64 बिट DLL के रूप में जोड़ा गया है। ऐसा लगता है कि यह एक लिंक समय त्रुटि होगी लेकिन स्पष्ट रूप से नहीं।

मशीन बी पर, सब कुछ संकलित और सही ढंग से चलता है। Depends.exe पुष्टि करता है कि exe और सभी जुड़े DLLs 32-बिट हैं।

qmake: qmake.exe PROJECT.pro -r -spec win32-msvc2010 "CONFIG+=declarative_debug" 

मेरा मानना ​​है कि -spec win32-msvc2010 हिस्सा एक 32 बिट का निर्माण निर्दिष्ट करने के लिए पर्याप्त है:

मेरे क्यूटी परियोजना के रूप में निम्नानुसार कॉन्फ़िगर किया गया है।

परियोजना फ़ाइल स्पष्ट विंडोज आयात lib में स्थित फ़ाइलों के लिए लिंक: सी:/प्रोग्राम फ़ाइलें (x86)/माइक्रोसॉफ्ट SDKs/विंडोज/v7.0A/लिब मैंने पुष्टि की है इन 32 बिट आयात libs हैं । प्रोजेक्ट फ़ाइल में एक स्पष्ट LIB + = पंक्ति इस पथ को कॉल करती है। यदि यह लाइन प्रोजेक्ट फ़ाइल से हटा दी गई है, तो लिंक वैसे भी सफल हो जाता है। तो मुझे यकीन नहीं है कि विंडोज सिस्टम आयात libs का स्थान उस मामले में निर्दिष्ट किया गया है।

मैंने आयात किए गए डंपबिन के साथ सत्यापित किया है। Libs को 32 या 64 बिट के रूप में टैग किया गया है। हम 32 आयात libs के साथ स्थानों को निर्दिष्ट कर रहे हैं।

क्योंकि एक मशीन काम करती है और दूसरा नहीं, मुझे विश्वास है कि समस्या मशीन कॉन्फ़िगरेशन में से एक है। इसलिए, मैं हटा दिया और फिर से स्थापित मशीन एक से एमएस उपकरण:

  • अनइंस्टॉल किया VS2010, Windows 8 एसडीके, .नेट फ्रेमवर्क 4.5, क्यूटी पुस्तकालय और QtCreator।
  • इस क्रम में ऊपर के सभी Reinstalled,:

    1. VS2010
    2. VS2010 SP1
    3. .NET फ्रेमवर्क 4.5
    4. Windows 8 एसडीके
    5. क्यूटी पुस्तकालय 4.8.4
    6. QtCreator 2.7.1

मुझे अभी भी 64 बिट डीएलएल से जुड़ा 32 बिट एक्सई मिलता है।

अजीब लिंकिंग का कारण क्या हो सकता है? और/या मैं यह निर्धारित कैसे कर सकता हूं कि यह क्यों सोचता है कि इसे 64 बिट डीएलएल से लिंक करना चाहिए?

उत्तर

1

यह नहीं है। सवाल पाठ से

उत्तर:

यह सभी अनिवार्य रूप से फर्जी है। यह उस मशीन पर Depends.exe का संस्करण दिखाता है जहां एप्लिकेशन चलाता है 32 बिट संस्करण था। पर यह तय करने पर, दोनों मशीन सिस्टम DLL को 64 बिट के रूप में दिखाती हैं, इसलिए समस्या का स्रोत नहीं है।

आखिरकार समस्या एक 64 बिट डीएलएल थी। निर्भरता वॉकर के सही संस्करण का उपयोग करने के बाद ढूंढना आसान था। 32 बनाम 64 बिट संस्करण का चयन करना आपके द्वारा चलाए जा रहे प्लेटफ़ॉर्म पर आधारित नहीं है। FAQ से:

निर्भरता वाकर किसी भी 32-बिट या 64-बिट Windows मॉड्यूल के साथ काम करेंगे। 32-बिट और 64-बिट संस्करण निर्भरता वॉकर हैं। सभी संस्करण 32-बिट और 64-बिट मॉड्यूल सक्षम या खोलने योग्य हैं। हालांकि, 32-बिट निर्भरता वॉकर का उपयोग करने के लिए 32-बिट मॉड्यूल और 64-बिट निर्भरता वॉकर को 64-बिट मॉड्यूल को संसाधित करने के लिए उपयोग करने के लिए प्रमुख फायदे हैं। विंडोज के 64-बिट संस्करण पर चलते समय यह विशेष रूप से सच है, जो 32-बिट और 64-बिट दोनों प्रोग्रामों को निष्पादित करने की अनुमति देता है। 64-बिट विंडोज़ (जिसे "WOW64" के नाम से जाना जाता है) पर 32-बिट उपप्रणाली का अपना निजी रजिस्ट्री, "ऐपपैथ", "ज्ञात डेल", सिस्टम फ़ोल्डर्स और मैनिफेस्ट प्रोसेसिंग है। निर्भरता वॉकर का केवल 32-बिट संस्करण इस 32-बिट वातावरण तक पहुंच सकता है, जिसे को 32-बिट मॉड्यूल को सटीक रूप से संसाधित करने की आवश्यकता होती है।इसी तरह, केवल निर्भरता के 123-बिट संस्करण वॉकर 64-बिट वातावरण को पूरी तरह से एक्सेस कर सकता है, इसलिए यह हमेशा होना चाहिए जो 64-बिट मॉड्यूल को प्रोसेस करने के लिए उपयोग किया जाता है।

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