Здесь вы найдете параметры командной строки компилятора Microsoft C ++ здесь .
Рассмотрите следующие ключи для cl:
/nologo /GS /fp:precise /Zc:forScope /Gd
... и свяжите свойфайл с использованием
/NOLOGO /OUT:"your.dll" /DLL <your lib files> /SUBSYSTEM:WINDOWS /MACHINE:X86 /DYNAMICBASE
Пожалуйста, посмотрите, что эти опции значат в деталях, я только перечислил общие.Тем не менее, вы должны знать об их эффекте, поэтому постарайтесь избегать копирования и вставки и убедитесь, что это действительно то, что вам нужно - приведенная выше документация поможет вам.Это просто настройка, которую я использую более или менее часто.
Имейте в виду, что вы всегда можете открыть Visual Studio, настроить параметры сборки и скопировать вызовы командной строки из диалогового окна конфигурации проекта.
Редактировать: Хорошо, вот еще один совет, учитывая новую информацию, которую вы отредактировали в свой первоначальный вопрос.Я взял пример кода вашей простой DLL и вставил его в исходный файл и сделал два изменения:
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
extern "C" __declspec(dllexport) int __stdcall multiply(int num1, int num2)
{
return num1 * num2;
}
Прежде всего, я обычно ожидаю, что функции, экспортируемые из DLL, будут использовать соглашение о вызовах stdcall, простопотому что это обычное дело в Windows, и есть языки, которые по своей сути не могут справиться с cdecl, поскольку они знают только stdcall.Итак, это одно изменение, которое я сделал.
Во-вторых, чтобы сделать экспорт более удобным, я указал extern "C", чтобы избавиться от искажения имени .Затем я приступил к компиляции кода из командной строки следующим образом:
cl /nologo /GS /Zc:forScope /Gd c.cpp /link /OUT:"foobar.dll" /DL kernel32.lib /SUBSYSTEM:WINDOWS /MACHINE:X86
Если вы используете инструмент DUMPBIN из набора инструментов Visual Studio, вы можете проверить свою DLL на предмет экспорта:
dumpbin /EXPORTS foobar.dll
Видя что-то вроде этого ...
ordinal hint RVA name
1 0 00001010 ?multiply@@YGHHH@Z
... вы можете заметить, что экспортированное имя искажено.Обычно вам нужны четкие имена для экспорта, поэтому либо используйте файл DEF, чтобы указать экспорт более подробно, либо ярлык сверху.
После этого я получаю DLL, которую можно загрузить в Python, напримерthis:
In [1]: import ctypes
In [2]: dll = ctypes.windll.LoadLibrary("foobar.dll")
In [3]: dll.multiply
Out[3]: <_FuncPtr object at 0x0928BEF3>
In [4]: dll.multiply(5, 5)
Out[4]: 25
Обратите внимание, что я использую здесь ctypes.windll, что подразумевает stdcall.