解决 警告 inconsistent dll linkage
这个问题也是在写c++ dll 的过程中遇到的,有空的时候我来补充完整的代码。
终于有时间了,原来还有人遇到这个问题的,我来补充完整.
一、dll中的代码举例如下
//MYDLL.h文件 //////////// #ifdef MYDLL_EXPORTS #define PREDLL_API __declspec(dllexport) #else #define PREDLL_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif PREDLL_API void TestFun(); #ifdef __cplusplus } #endif /////////// //MYDLL.cpp文件 //////////// #include "stdafx.h" #include "MYDLL.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } PREDLL_API void TestFun() { //函数实现 }
如果你建一个项目,没有使用名称MYDLL,将这段代码,复制过去,就会提示 inconsistent dll linkage 警告。作者就是因为这样,才出的问题。
解决方法是:
在 工程--属性--配置属性--c/c++--预处理器--预处理定义, 增加MYDLL_EXPORTS,预定义,问题就可以解决了。(这个问题比较低级,作者是初用c++,所以才出现这种状况)
问题虽然解决了,但道理还不清楚呢.
我来解释一下原因:
PREDLL_API依赖于是否定义了MYDLL_EXPORTS来决定宏展开为__declspec(dllexport)还是__declspec(dllimport)
展开为__declspec(dllexport)是DLL编译时的需要,通知编译器该函数是需要导出供外部调用的。
展开为__declspec(dllimport)是给调用者用的,通知编译器,该函数是个外部导入函数。
对于工程设置里面的预定义宏,是最早被编译器看到的。所以当编译器编译DLL工程中的MYDLL.cpp时,因为看到前面有工程设置有定义MYDLL_EXPORTS,所以就把PREDLL_API展开为__declspec(dllexport)了。
这样做的目的是为了让DLL和调用者共用同一个h文件,在DLL项目中,定义MYDLL_EXPORTS,PREDLL_API就是导出;在调用该DLL的项目中,不定义MYDLL_EXPORTS,PREDLL_API就是导入。
这样就明白了吧!
不知本篇博文对你有没有帮助, 请多多支持!