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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章