从msdn的(在Dll中为导出类,在调用Dll工程的exe中为导入类)解释中可以知道
在编译DLL的时候,动态库上的类,函数,变量都应该用dllexport设置为导出
在使用DLL时,动态库上的类,函数,变量都应该用dllimport设置为导入
如何做到这点呢
一个简单的做法就是在DLL的.cpp加入
#define DLLCLASS_EXPORTS
在头文件中加入
#ifdef DLLCLASS_EXPORT
#define EXT_CLASS _declspec(dllexport)
#else
#define EXT_CLASS _declspec(dllimport)
#endif
这样的话DLL的CPP文件在编译的时候因为DLLCLASS_EXPORTS有定义,所以EXT_CLASS被定义为dllexport(导出)
使用DLL的时候是不需要cpp文件,因此DLLCLASS_EXPORTS没有定义,所以EXT_CLASS被定义为dllimport(导入)
_declspec(dllexport)与_declspec(dllimport)是相互呼应,只有在DLL内部用dllexport作了声明,才能 在外部函数中用dllimport导入相关代码。实际上,在应用程序访问DLL时,实际上就是应用程序中的导入函数与DLL文件中的导出函数进行链接。而 且链接的方式有两种:隐式迎接和显式链接。
隐式链接是指通过编译器提供给应用程序关于DLL的名称和DLL函数的链接地址,而在应用程序中不需要显式地将DLL加载到内存,即在应用程序中使用dllimport即表明使用隐式链接。不过不是所有的隐式链接都使用dllimport。
显式链接刚同应用程序用语句显式地加载DLL,编译器不需要知道任何关DLL的信息
dllimport是为了更好的处理类中的静态成员变量的,如果没有静态成员变量,那么这个__declspec(dllimport)无所谓。