微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解决警告inconsistent dll linkage

今天用C++动态库导出一个类,导出头文件如下:

#pragma once
#ifdef DLLMSG_EXPORTS
#define DLLMSG_API __declspec(dllexport)
#else
#define DLLMSG_API __declspec(dllimport)
#endif
class DLLMSG_API CDealAppMsg
{
public:
 CDealAppMsg(void){};
 virtual ~CDealAppMsg(void){};
 void dispatchMsg(WORD v_imsgType,DWORD wParam,DWORD lParam);
 void SndMsgData2App(int v_imsgDirection,DWORD v_dwCmd,void *v_pDat,int v_dwLen);
 void SndMsgReg2App(int v_imsgDirection,DWORD lParam);
private:
 void _DealRegMsg(DWORD wParam,DWORD lParam);
 void _DealcopyDataMsg(DWORD wParam,DWORD lParam);
 HWND _GetAppWnd(int v_imsgDirection);
};

编译出现警告:inconsistent dll linkage


解决方法

在  工程--属性--配置属性--c/c++--预处理器--预处理定义, 增加DLLMSG_API预定义,问题就可以解决了。(这个问题比较低级,作者是初用c++,所以才出现这种状况)


原因:
代码依赖于是否定义了DLLMSG_API来决定宏展开为__declspec(dllexport)还是__declspec(dllimport)
展开为__declspec(dllexport)是DLL编译时的需要,通知编译器该函数是需要导出供外部调用的。 
展开为__declspec(dllimport)是给调用者用的,通知编译器,该函数是个外部导入函数
对于工程设置里面的预定义宏,是最早被编译器看到的。所以当编译器编译DLL工程时,因为看到前面有工程设置有定义DLLMSG_API,所以就把PREDLL_API展开为__declspec(dllexport)了。
这样做的目的是为了让DLL和调用者共用同一个h文件,在DLL项目中,定义MYDLL_EXPORTS,PREDLL_API就是导出;在调用该DLL的项目中,不定义MYDLL_EXPORTS,PREDLL_API就是导入。
 
 


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐