2011-10-01 71 views
2

我的最終目標是從我的MSVC應用程序執行g ++以在運行時構建dll。 g ++創建的dll將被MSVC應用程序加載使用。用g ++編譯用於MSVC應用程序的dll

只需使用命令行我設法建立一個DLL瞎搞一些測試代碼,但它似乎有一些問題:

C:\MinGW\bin>g++ -shared -o testdll.dll AIFuncs_RF.cpp AIFuncs_RF.def 
Warning: resolving _CreateAIModule by linking to [email protected] 
Use --enable-stdcall-fixup to disable these warnings 
Use --disable-stdcall-fixup to disable these fixups 
Warning: resolving _DestroyAIModule by linking to [email protected] 

這裏是我的DEF文件:

LIBRARY "AIFuncs_RF" 

EXPORTS 

CreateAIModule=CreateAIModule @1 
DestroyAIModule=DestroyAIModule @2 

而且代碼爲主dll:

BOOL APIENTRY DllMain(HMODULE hModule, DWORD Reason, LPVOID pReserved) 
{ switch (Reason) 
{ 
case DLL_PROCESS_ATTACH: 
case DLL_THREAD_ATTACH: 
case DLL_THREAD_DETACH: 
case DLL_PROCESS_DETACH: 
break; 
} 

return TRUE; 
} 

extern "C" void __stdcall 
CreateAIModule() 
{ 
} 

extern "C" void __stdcall 
DestroyAIModule() 
{ 
} 

任何想法,爲什麼功能沒有正確鏈接?

非常感謝您的幫助。

回答

1

gcc和Microsoft C編譯器的stdcall命名約定有所不同。在@之後,gcc將推入堆棧的參數大小添加到函數名稱中。 MS沒有。你的def文件包含MS版本,所以gcc使用它的自動修正來提供MS樣式符號。

這本身不是一個錯誤。 gcc只是警告你它已經做了這樣的事情,你應該通過提供--enable-stdcall-fixup鏈接器標誌(so,-wl,--enable-stdcall-fixup給編譯器調用)來明確這一點。

@符號的原因是BTW相當理智:stdcall函數在返回時從堆棧中彈出它們的參數,並且調用者推送它們,因此它們必須完全同意這些參數的大小或堆棧損壞將發生災難性結果。