Сборка dll с g++ для использования с приложением MSVC
Моя конечная цель здесь - выполнить g++ из моего приложения MSVC для сборки dll во время выполнения. DLL-файлы, которые создает g++, будут загружены приложением 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
Вот мой файл определения:
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 ответ
Соглашения об именовании gd и компилятора C Microsoft в stdcall различаются. Gcc добавляет размер аргументов, помещаемых в стек, к имени функции после @. МС нет. Ваш файл def содержит версии MS, поэтому gcc использует автоматическое исправление для предоставления символов стиля MS.
Это само по себе не ошибка. GCC просто предупреждает вас, что он сделал такую вещь, и вы должны сделать это явно, предоставив --enable-stdcall-fixup
флаг компоновщика (итак, -wl,--enable-stdcall-fixup
на вызов компилятора).
Причина для обозначения @ заключается в том, что BTW довольно вменяема: функции stdcall по возвращении извлекают свои аргументы из стека, и вызывающая сторона их выталкивает, поэтому они должны полностью согласиться с размером этих аргументов, иначе произойдет повреждение стека с катастрофическими результатами.