今天用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 wParam,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就是导入。