c++ - __Declspec(dllimport) क्यों/कब आवश्यक है?



visual-c++-2005 (1)

यह आवश्यक नहीं है। यह एक अनुकूलन है, संकलक के लिए एक संकेत है कि डीएलएल डीएलएल के आईएटी में सिर्फ एक प्रविष्टि के बजाय सीधे कार्य सूचक को निर्यात करने जा रहा है। Foo () नामक फ़ंक्शन के लिए निर्यातित फ़ंक्शन पॉइंटर __imp_foo होगा। जो इसे बेहतर कोड उत्पन्न करने की अनुमति देता है, आईएटी से एक फ़ंक्शन पॉइंटर लोड सहेजता है और अप्रत्यक्ष कूदता है। यह एक समय अनुकूलन है, अंतरिक्ष नहीं।

इस ब्लॉग पोस्ट में विवरण है।

Server.dll और a client.exe का उपयोग कर प्रोजेक्ट में, मेरे पास dllexport सर्वर सर्वर dllimport से एक सर्वर प्रतीक है, और क्लाइंट exe में इसे dllimport नहीं dllimport

फिर भी, आवेदन लिंक, और किसी भी समस्या के बिना शुरू होता है। क्या dllimport जरूरत नहीं है, तो ???

विवरण:

मेरे पास यह 'सर्वर' डीएल है:

// server.h
#ifdef SERVER_EXPORTS
  #define SERVER_API __declspec(dllexport)
#else
  #define SERVER_API // =====> not using dllimport!
#endif
class  SERVER_API CServer {
   static long s;
   public:
   CServer();
};

// server.cpp
CServer::CServer(){}

long CServer::s;

और यह ग्राहक निष्पादन योग्य:

#include <server.h>
int main() {
   CServer s;
}

सर्वर कमांड लाइन:

cl.exe /Od  /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" 
 /D "SERVER_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" 
 /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" 
 /Fp"Debug\server.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" 
 /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt

cl.exe /OUT:"U:\libs\Debug\server.dll" /INCREMENTAL:NO /NOLOGO /DLL 
/MANIFEST /MANIFESTFILE:"Debug\server.dll.intermediate.manifest" 
/DEBUG /PDB:"u:\libs\Debug\server.pdb" 
/SUBSYSTEM:WINDOWS /MACHINE:X86 /ERRORREPORT:PROMPT 
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib 
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

ग्राहक कमांड लाइन:

cl.exe /Od /I "..\server" 
 /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" 
 /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /c /Wp64 /ZI /TP 
 .\client.cpp

cl.exe /OUT:"U:\libs\Debug\Debug\client.exe" /INCREMENTAL 
/LIBPATH:"U:\libs\Debug" 
/MANIFEST /MANIFESTFILE:"Debug\client.exe.intermediate.manifest" 
/DEBUG /PDB:"u:\libs\debug\debug\client.pdb" 
/SUBSYSTEM:CONSOLE /MACHINE:X86 
server.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib




declspec