मैंने Qt स्रोत कोड को इस तरह देखा:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
कौन सा Q_CORE_EXPORT
मैक्रो नीचे की तरह परिभाषित करता है:
define Q_DECL_IMPORT __declspec(dllimport)
तो __declspec(dllimport)
वास्तव में क्या मतलब है?
मैंने Qt स्रोत कोड को इस तरह देखा:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
कौन सा Q_CORE_EXPORT
मैक्रो नीचे की तरह परिभाषित करता है:
define Q_DECL_IMPORT __declspec(dllimport)
तो __declspec(dllimport)
वास्तव में क्या मतलब है?
जवाबों:
__declspec
Microsoft-विशिष्ट विशेषता है जो आपको संग्रहण-श्रेणी की जानकारी निर्दिष्ट करने की अनुमति देता है।
(नाइटपिकर कॉर्नर: हालाँकि, कई अन्य संकलक विक्रेता- जैसे GCC- अब कोड के स्थापित आधार के साथ संगतता के लिए इस भाषा विस्तार का समर्थन करते हैं जो Microsoft के संकलक को लक्षित करते हुए लिखा गया था। कुछ अतिरिक्त संग्रहण-श्रेणी के गुण भी प्रदान करते हैं।)
उन भंडारण-वर्ग विशेषताओं में से दो जिन्हें निर्दिष्ट किया जा सकता है dllimport
और हैं dllexport
। ये संकलक को इंगित करते हैं कि एक फ़ंक्शन या ऑब्जेक्ट DLL से आयात (निर्यात) (क्रमशः) किया जाता है।
अधिक विशेष रूप से, वे मॉड्यूल-डेफिनिशन ( .DEF
) फ़ाइल की आवश्यकता के बिना क्लाइंट को DLL के इंटरफ़ेस को परिभाषित करते हैं । अधिकांश लोग DEF फ़ाइलों को बनाने की तुलना में इन भाषा एक्सटेंशन का उपयोग करना बहुत आसान समझते हैं।
स्पष्ट कारणों के लिए, __declspec(dllimport)
और __declspec(dllexport)
आम तौर पर एक दूसरे के साथ जोड़ा जाता है। आप dllexport
DLL से निर्यात किए गए प्रतीक को चिह्नित करने के लिए उपयोग करते हैं , और आप उपयोग करते हैं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
C ++ भाषा के विस्तार के रूप में नोटेशन का आविष्कार किया । मेरा मानना है कि GCC अब इसका समर्थन करता है, लेकिन यह मुख्य रूप से Microsoft के संकलक के साथ संगतता कारणों के लिए है। और मुझे समझ नहीं आ रहा है कि "कंपाइल विशिष्ट" से "MS-specific" कैसे अलग है। Microsoft ने C ++ कंपाइलर लिखा और बहुत सारे लोग इसका उपयोग करते हैं। यह विजुअल स्टूडियो के साथ आता है।
__declspec(dllimport)
एक स्टोरेज-क्लास स्पेसियर है जो कंपाइलर को बताता है कि एक फ़ंक्शन या ऑब्जेक्ट या डेटा प्रकार बाहरी DLL में परिभाषित किया गया है।
फ़ंक्शन या ऑब्जेक्ट या डेटा प्रकार एक DLL से संबंधित के साथ निर्यात किया जाता है __declspec(dllexport)
।
__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
इसका मतलब है कि फ़ंक्शन की परिभाषा एक गतिशील पुस्तकालय में है। अधिक विवरण और उदाहरण के लिए प्रलेखन देखें ।