2011-01-10 131 views
5

我試圖寫一個dll,這是怎麼看我的頭文件:使用dllimport的過程

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void HelloWorld (void); 


#endif /* _DLL_H_ */ 

在.cpp文件包括我這個頭文件,我嘗試聲明一個DLL導入過程這樣:

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION); 
} 

但是編譯器(我已經在Windows 7 MINGW32 64位)不斷給我這個錯誤:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport| 
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':| 
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored| 
||=== Build finished: 1 errors, 1 warnings ===| 

我不明白爲什麼。

+0

我合併了你的兩個帳戶,所以你現在應該能夠接受答案。 – 2011-01-10 18:53:28

回答

3

declspec(dllimport)在模塊的模塊導入表中生成條目。此導入表用於解析鏈接時符號的引用。加載時,這些引用由加載程序修復。

declspec(dllexport)在DLL的DLL導出表中生成條目。此外,您需要實現用它聲明的符號(函數,變量)。

既然你實現了DLL,你必須定義BUILDING_DLL。這可以用#define完成,但是應該在項目設置中更好地設置。

+1

或者將`/ D BUILDING_DLL`傳遞給編譯器(我相信這是更普遍的選擇) – MSalters 2011-01-10 10:27:47

2

在意識到我沒有真正定義BUILDING_DLL之前,我有完全相同的錯誤。

因此,DLLIMPORT被定義爲__declspec (dllimport)而不是__declspec (dllexport)。在我定義符號之後,問題就解決了。

既然你在MinGW的,您需要通過以下事項:

-DBUILDING_DLL 

的編譯器選項,或只是在你的文件的頂部添加

#define BUILDING_DLL 

。前者更好,如果你不知道如何將-DBUILDING_DLL選項傳遞給gcc,則只使用#define解決方案。