__declspec (dllimport) का वास्तव में क्या मतलब है?


91

मैंने Qt स्रोत कोड को इस तरह देखा:

class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};

कौन सा Q_CORE_EXPORTमैक्रो नीचे की तरह परिभाषित करता है:

define Q_DECL_IMPORT __declspec(dllimport)

तो __declspec(dllimport)वास्तव में क्या मतलब है?


जवाबों:


118

__declspecMicrosoft-विशिष्ट विशेषता है जो आपको संग्रहण-श्रेणी की जानकारी निर्दिष्ट करने की अनुमति देता है।
(नाइटपिकर कॉर्नर: हालाँकि, कई अन्य संकलक विक्रेता- जैसे GCC- अब कोड के स्थापित आधार के साथ संगतता के लिए इस भाषा विस्तार का समर्थन करते हैं जो Microsoft के संकलक को लक्षित करते हुए लिखा गया था। कुछ अतिरिक्त संग्रहण-श्रेणी के गुण भी प्रदान करते हैं।)

उन भंडारण-वर्ग विशेषताओं में से दो जिन्हें निर्दिष्ट किया जा सकता है dllimportऔर हैं dllexport। ये संकलक को इंगित करते हैं कि एक फ़ंक्शन या ऑब्जेक्ट DLL से आयात (निर्यात) (क्रमशः) किया जाता है।

अधिक विशेष रूप से, वे मॉड्यूल-डेफिनिशन ( .DEF) फ़ाइल की आवश्यकता के बिना क्लाइंट को DLL के इंटरफ़ेस को परिभाषित करते हैं । अधिकांश लोग DEF फ़ाइलों को बनाने की तुलना में इन भाषा एक्सटेंशन का उपयोग करना बहुत आसान समझते हैं।

स्पष्ट कारणों के लिए, __declspec(dllimport)और __declspec(dllexport)आम तौर पर एक दूसरे के साथ जोड़ा जाता है। आप dllexportDLL से निर्यात किए गए प्रतीक को चिह्नित करने के लिए उपयोग करते हैं , और आप उपयोग करते हैंdllimport उस निर्यात किए गए प्रतीक को किसी अन्य फ़ाइल में आयात लिए करते हैं।

इस वजह से, और क्योंकि एक ही हैडर फ़ाइल को आमतौर पर DLL को संकलित करते समय और DLL के इंटरफ़ेस का उपभोग करने वाले क्लाइंट कोड में दोनों का उपयोग किया जाता है, यह मैक्रो को परिभाषित करने के लिए एक सामान्य पैटर्न है जो स्वचालित रूप से संकलन समय पर उपयुक्त विशेषता विनिर्देशक के लिए हल करता है। उदाहरण के लिए:

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

और फिर उन सभी प्रतीकों को चिह्नित करना चाहिए जिनके साथ निर्यात किया जाना चाहिए DLLEXPORT

मुमकिन है, कि Q_CORE_EXPORTमैक्रो करता है, Q_DECL_IMPORTया तो हल करने के लिए या Q_DECL_EXPORT


__declspec ठीक से "MS-specific" नहीं है (यह बहुत अधिक "कंपाइलर विशिष्ट है) और कुछ कंपाइलर इस घोषणा का उपयोग कई प्लेटफॉर्म के लिए भी करते हैं। lexicon)।
एमिलियो गरवाग्लिया

9
@ ईमिलियो: जहां तक ​​मुझे जानकारी है, माइक्रोसॉफ्ट ने __declspecC ++ भाषा के विस्तार के रूप में नोटेशन का आविष्कार किया । मेरा मानना ​​है कि GCC अब इसका समर्थन करता है, लेकिन यह मुख्य रूप से Microsoft के संकलक के साथ संगतता कारणों के लिए है। और मुझे समझ नहीं आ रहा है कि "कंपाइल विशिष्ट" से "MS-specific" कैसे अलग है। Microsoft ने C ++ कंपाइलर लिखा और बहुत सारे लोग इसका उपयोग करते हैं। यह विजुअल स्टूडियो के साथ आता है।
कोड़ी ग्रे

8
Microsoft एक संकलक बनाता है। इसे "Microsoft C / C ++ ऑप्टिमाइज़िंग कंपाइलर", cl.exe कहा जाता है। बहुत से लोग गलत तरीके से विजुअल स्टूडियो को संदर्भित करते हैं जैसे कि यह एक संकलक है, लेकिन यह एक आईडीई है। मुझे नहीं पता कि लोग "Microsoft-specific" के बारे में क्या अर्थ निकाल रहे हैं। इसका मतलब "MS वातावरण" नहीं है (जो कुछ भी है), और यह निश्चित रूप से "विंडोज" का मतलब नहीं है। हां, अन्य संकलक विक्रेता अब Microsoft संकलक को लक्षित कोड के स्थापित आधार के साथ संगतता के लिए विस्तार का समर्थन करते हैं। जैसा कि मैंने पहले कहा था, जहां तक ​​मुझे जानकारी है, Microsoft ने सिंटैक्स का आविष्कार किया था। यहीं पर बनी बात।
कोड़ी ग्रे

2
@ कोडीग्रे: माइक्रोसॉफ्ट ने अकेले इसका आविष्कार किया था जो पर्याप्त नहीं होगा। हालाँकि Microsoft ने इसका आविष्कार किया था, इसका कोई मानक नहीं है, अन्य केवल इसे अनुकूलता के लिए लागू करते हैं और इसे मुख्य रूप से (यदि विशेष रूप से नहीं) Microsoft Windows को लक्षित करने वाले कार्यक्रमों के लिए एक साथ उपयोग किया जा रहा है, तो इसे "Microsoft विशिष्ट"
celtschk

6
यह एक भयानक जवाब है, विशेष रूप से "के बारे में हिस्सा है क्योंकि एक ही हेडर फ़ाइल आमतौर पर DLL और क्लाइंट कोड को संकलित करते समय दोनों का उपयोग किया जाता है"! आयात / निर्यात-सामान क्रिस्टल के हर पहलू को स्पष्ट करता है।
इला 782

30

__declspec(dllimport) एक स्टोरेज-क्लास स्पेसियर है जो कंपाइलर को बताता है कि एक फ़ंक्शन या ऑब्जेक्ट या डेटा प्रकार बाहरी DLL में परिभाषित किया गया है।

फ़ंक्शन या ऑब्जेक्ट या डेटा प्रकार एक DLL से संबंधित के साथ निर्यात किया जाता है __declspec(dllexport)


6
ठीक। अंत में, 2 घंटे पढ़ने के बाद, मुझे सबसे संतोषजनक, सबसे संक्षिप्त, जो मैं चाहता हूं, उसके बिंदु कथन के लिए सटीक पाया।
एल साइसी कांग्रो

1

__declspec(dllexport)लिंकर को सूचित करने के लिए संकलक को बताता है कि इन प्रतीकों को निर्यात तालिका में रखा जाना चाहिए (जब संकलन .dll)। .Dll के साथ लिंक करने वाले प्रोग्राम को संकलित करते समय, __declspec(dllimport)कंपाइलर लिए एक रिप-रिलेटिव निरपेक्ष रजिस्टर- का उत्पादन करने के लिए कहता है तो सामान्य रिप-रिश्तेदार रजिस्टर-डायरेक्ट के बजाय इनडायरेक्ट कॉल (जो कि इंवेस्टर इंपोर्ट टेबल पर इंगित करने का संकल्प भर देगाएक अपरिभाषित फ़ंक्शन के लिए अप्रत्यक्ष कॉल निर्देश (जो कि, यह निर्देश को संशोधित नहीं कर सकता है, लिंकर एक ठग के रिश्तेदार पते को सम्मिलित करता है और फिर ठग बनाता है, जिसके अंदर यह रिप-रिलेटिव निरपेक्ष रजिस्टर-अप्रत्यक्ष कॉल अप्रत्यक्ष रूप से डालता है समारोह सूचक आयात तालिका में)। यह एक कोड आकार और गति अनुकूलन है। यह इंपोर्ट लाइब्रेरी है। लिब जो बताता है कि कौन सा सिंबल इम्पोर्ट किया जाएगा और इम्पोर्ट टेबल बनाने के लिए एक गाइड के रूप में इस्तेमाल किया जाता है और .text सेगमेंट में किसी भी जरूरी थ्रेड को बनाया जाता है।

https://docs.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=vs-2019 https://docs.microsoft.com/en-us/ppp / बिल्ड-इंपोर्ट-डेटा-यूज़िंग-डिसकस-डेक्लेमपोर्ट? देखें = बनाम-2019 https://stackoverflow.com/a/4490536/7194773


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.