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)您可能有重复的定义/声明.