Сборка 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 по возвращении извлекают свои аргументы из стека, и вызывающая сторона их выталкивает, поэтому они должны полностью согласиться с размером этих аргументов, иначе произойдет повреждение стека с катастрофическими результатами.

Другие вопросы по тегам