簡體   English   中英

使用G ++構建DLL以與MSVC應用程序一起使用

[英]Building dll with g++ for use with MSVC application

我的最終目標是從我的MSVC應用程序執行g ++以在運行時構建dll。 然后,由g ++創建的dll將由MSVC應用程序加載以供使用。

只是使用命令行弄亂了一些測試代碼,我設法建立了一個dll,但似乎有一些問題:

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

這是我的def文件:

LIBRARY "AIFuncs_RF"

EXPORTS

CreateAIModule=CreateAIModule @1
DestroyAIModule=DestroyAIModule @2

和dll main的代碼:

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()
{
}

關於功能未正確鏈接的任何想法?

非常感謝您的幫助。

gcc的stdcall命名約定與Microsoft的C編譯器不同。 gcc將被壓入堆棧的參數的大小添加到@之后的函數名稱中。 MS不會。 您的def文件包含MS版本,因此gcc使用其自動修復功能提供MS樣式符號。

這本身不是錯誤。 gcc只是警告您它已經做過這樣的事情,您應該通過提供--enable-stdcall-fixup鏈接器標志(因此, -wl,--enable-stdcall-fixup到編譯器調用)來明確表明這一點。

@表示法的原因是BTW相當理智:stdcall函數在返回時將其參數從堆棧中彈出,並且調用者將其推入,因此它們必須完全同意這些參數的大小,否則堆棧損壞將導致災難性的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM