VS2005 DLL-关于warning : inconsistent dll linkage 的解决

解决 warning : inconsistent dll linkage

//////////////////
//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()
{
//函数实现
}

--------------------------------------------------------------------------------------

解决方法是:

在  工程--属性--配置属性--c/c++--预处理器--预处理定义, 增加MYDLL_EXPORTS,预定义,问题就可以解决了。(这个问题比较低级,作者是初用c++,所以才出现这种状况)

 

英文版的为 Project -> Properties -> Configuration Properties -> c/c++ -> Preprocessor,在Preprocessor Definitions处添加 MYDLL_EXPORTS

--------------------------------------------------------------------------------------

原因:

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就是导入。

--------------------------------------------------------------------------------------

只要记住一点:

只要使用了如下的DLL导出导入:

#ifdef MYDLL_EXPORTS
#define PREDLL_API __declspec(dllexport)
#else
#define PREDLL_API __declspec(dllimport)
#endif

就需要在导出处添加MYDLL_EXPORTS预定义宏

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