关于不一致的dll链接

bar*_*noz 40 c++ dll warnings linkage

如何删除此链接警告?您可以看到导致此警告的代码段.

static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };
//bla bla
// Exported DLL initialization is run in context of running application
    extern "C" void WINAPI InitGuiCtrlsDLL()
    {
     // create a new CDynLinkLibrary for this app
      new CDynLinkLibrary(GuiCtrlsDLL);
     // nothing more to do
    }
Run Code Online (Sandbox Code Playgroud)

警告C4273:'InitGuiCtrlsDLL':不一致的dll链接

我还有导出和导入定义,例如:

#ifdef _GUICTRLS
   #define GUI_CTRLS_EXPORT __declspec(dllexport)
#else
   #define GUI_CTRLS_EXPORT  __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

小智 41

预处理器语句的目的:

#ifdef _GUICTRLS 
   #define GUI_CTRLS_EXPORT __declspec(dllexport) 
#else 
   #define GUI_CTRLS_EXPORT  __declspec(dllimport) 
#endif 
Run Code Online (Sandbox Code Playgroud)

是确保头文件在定义它的.dll中将类或函数声明为__declspec(dllexport),并将__declspec(dllimport)声明为可能想要使用它的任何其他.dll.

为此,必须在编译导出.dll时定义_GUICTRLS,而不为任何其他.dll定义_GUICTRLS.通常,您希望在项目属性中定义_GUICTRLS,在C/C++ - >预处理器 - >预处理器定义下.

您看到的编译器错误通常是因为没有为正在执行导出的项目定义_GUICTRLS,或者是为多个项目定义的,通常是因为从一个项目切换到另一个项目.如果在多个项目中包含的头文件中定义了_GUICTRLS,您也会看到这一点.


小智 22

有多种可能性:

1) static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };

您使用AFX_EXTENSION_MODULE.这意味着您正在实现MFC扩展DLL.对于此类扩展dll,您必须定义预处理器_AFXEXT.在Visual C++项目的C++编译器设置中设置它

看到:

如何在MFC扩展DLL中使用_declspec(dllexport):http://support.microsoft.com/kb/128199

(目前我不能发布超过1个链接,因为我的声誉小于10.我稍后会添加2个更重要的链接.所以如果这是解决方案,请将其标记为加快流程的答案;))

正如所承诺的,这里有两个链接:

AFX_EXTENSION_MODULE结构:http://msdn.microsoft.com/en-us/library/sxfyk0zk.aspx

TN033:MFC的DLL版本:http://msdn.microsoft.com/en-us/library/hw85e4bb.aspx

2)您可能有重复的定义/声明.