解決 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預定義宏