2013-05-12 46 views
2

我有內容的「.H」文件是這樣的:MinGW和@N DLL函數連接

#ifndef MY_IMPORT 
    #define MY_IMPORT __declspec(dllimport) /* !!! */ 
#endif 

#ifndef MY_EXPORT 
    #define MY_EXPORT __declspec(dllexport) 
#endif 

#ifdef __cplusplus 
    extern "C"{ 
#endif 

MY_IMPORT VOID* WINAPI XXX_FUNC(VOID * ARG1, ...); 

/* ... */ 

#ifdef __cplusplus 
} 
#endif 

和我有‘lib.dll’庫,其中出口XXX_FUNC無@N後綴。

當我嘗試建立我的DLL(MYDLL.DLL)至極使用此lib.dll我有GCC消息:

undefined reference to `[email protected]' 

我看了很多噸互聯網,包括計算器,但我無法找到解決方案。 鏈接稱爲:

g++ -shared -Wl,--enable-stdcall-fixup mydll.o -L. lib.dll -o mydll.dll 

,我可以找到,海灣合作委員會必須設法將 '_ 小鬼 _XXX_FUNC @ 12' 鏈接到 '_ 小鬼 _XXX_FUNC' 和「--enable-stdcall- fixup'只是防止這種情況發生警告的選項,但我的MinGW GCC不會嘗試這樣做。

我已經安裝了MinGW和GCC v4.7。

回答

0

您需要編譯與declspec(dllexport)激活的dll。你應該用這種替代MY_IMPORTMY_EXPORT

#ifdef _DLLifdef BUILDING_MY_DLL 
# define MY_API __declspec(dllexport) 
#else 
# define MY_API __declspec(dllimport) 
#endif 

當建立靜態,只是

#define MY_API 

你怎麼確定,是由你和你的編譯系統。我已經看到了各種方式來做到這一點。然後添加MY_API到出口所需的每個符號:

MY_IMPORT VOID* WINAPI XXX_FUNC(VOID * ARG1, ...); 

這將導致該DLL包含符號

__imp_XXX_FUNC... 

與一些其他的東西。請注意由於dllexport而添加的__imp_

是的,這是陳舊的(見GCC的visibility歸因於),但這是Windows的工作原理。

+0

我在編譯核心dll時定義了'#define MY_IMPORT __declspec(dllexport)',並且在嘗試編譯另一個使用核心dll的dll時沒有定義它,所以MY_IMPORT automaticaly定義爲__declspec(dllimport)頭。當我嘗試鏈接使用核心dll的另一個dll時,會發生問題 – 2013-05-12 14:42:29