Сборка dll с g ++ для использования с приложением MSVC - PullRequest
2 голосов
/ 02 октября 2011

Моя конечная цель здесь - выполнить g ++ из моего приложения MSVC для создания библиотек во время выполнения. 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 Ответ

1 голос
/ 12 ноября 2011

Соглашения о присвоении имен gd и компилятору C на языке stdcall различаются. Gcc добавляет размер аргументов, помещаемых в стек, к имени функции после @. МС нет. Ваш файл def содержит версии MS, поэтому gcc использует автоматическое исправление для предоставления символов стиля MS.

Это само по себе не ошибка. gcc просто предупреждает вас, что он сделал такую ​​вещь, и вы должны сделать это явным, предоставив флаг компоновщика --enable-stdcall-fixup (так, -wl,--enable-stdcall-fixup для вызова компилятора).

Причиной обозначения @ является BTW довольно вменяемое: функции stdcall по возвращении извлекают свои аргументы из стека, и вызывающая сторона их выталкивает, поэтому они должны полностью согласиться с размером этих аргументов, иначе может произойти повреждение стека с катастрофическими результатами. .

...