最近经常调用外部dll,使用dll导出的动态库和变量,开发过程中警告“warning C4273: dll链接不一致”以及Link2019的错误引起我了的注意!百度之,还是要牵扯到声明与定义的关系(函数、变量)!
首先,警告“warning C4273: dll链接不一致”的产生是由于dll导入导出(__declspec(dllexport)、__declspec(dllimport))的设置问题!需要在dll外部调用的变量和函数必须以__declspec(dllimport)方式在调用程序中使用,而在该dll内部必须是以__declspec(dllexport)的方式导出。严格遵守这个约定,就不会产生上面的警告。
为了方便,mfc中以宏(AFX_EXT_API、AFX_EXT_DATA)和预定义(_AFXEXT)的控制函数、变量的导入导出特征,同样我们也可以自定义宏或者预定义实现这种功能。比如导出函数可以采取下面的方式:
#ifdef MYAPI_IMPORTS
#define MYAPI_API __declspec(dllimport)
#else
#define MYAPI_API __declspec(dllexport)
#endif
在dll实现文件的头文件中加入上面的宏定义,在调用程序中做如下设置:
方法1: 选择项目->属性->预处理器->预处理定义, 增加:MYAPI_IMPORTS
方法2: 在头文件中重写上面的宏定义,并在前面加上MYAPI_IMPORTS的定义
#define MYAPI_IMPORTS
#ifdef MYAPI_IMPORTS
#define MYAPI_API __declspec(dllimport)
#else
#define MYAPI_API __declspec(dllexport)
#endif
请记住:不管你如何加宏定义或者预定义,一定要保证dll导出的函数、变量为__declspec(dllexport)方式,在调用程序中为__declspec(dllimport)方式!伴随导入导出设置错误引起的LNK2019也会迎刃而解!它产生的原因就是:函数、变量只有申明没有实现时,或是DLL中没有export,或者dll中导入而在调用程序中仍然是导出。
dll相关的知识考: http://blog.csdn.net/Ocean2006/archive/2009/12/21/5051126.aspx。