解决 警告 inconsistent dll linkage

 

解决 警告  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就是导入。

 

 

这样就明白了吧!

 

不知本篇博文对你有没有帮助, 请多多支持!

 

你可能感兴趣的:(c,api,dll,编译器)