由dll调用中的warning C4273和Link2019想到的

8 篇文章 0 订阅

     最近经常调用外部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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值