Зачем мне нужно __declspec (dllexport), чтобы сделать некоторые функции доступными из ctypes?

Поэтому я учусь использовать модуль ctypes Python.
Вот простой файл C, который я скомпилировал с помощью gcc -shared (версия 4.8) в Windows, чтобы получить образец .dll:

#include <stdio.h> int addition(int a, int b){ return a+b; } 

Теперь я могу получить доступ к нему из Python следующим образом:

 >>>from ctypes import * >>>mylibc = CDLL(r"somepath\mysample.dll") >>>mylibc.addition <_FuncPtr object at 0x00000000031456C8> >>>mylibc.addition(2,3) 5 

Теперь я пытаюсь сделать то же самое с другим, большим и сложным файлом .c, который содержит эту функцию:

 __declspec(dllexport) void __stdcall flopequity(HW hero[], HW villain[], double hcounters[], double vcounters[], double hsums[], double vsums[], ulong board, __int32 lenh, __int32 lenv) 

где HW является typedef для структуры. Я скомпилирую его с помощью GCC и могу получить доступ к этой функции, как и прежде, однако, когда я удаляю __declspec (dllexport) или _stdcall (или и то и другое), эта функция больше не доступна.
Мой вопрос заключается в том, что может быть причиной того, что я могу получить доступ к простой функции из первого примера, но мне не удается получить доступ к более сложной функции. Каковы правила использования условных соглашений / _declspec при компиляции кода C и доступа к нему из ctypes?

One Solution collect form web for “Зачем мне нужно __declspec (dllexport), чтобы сделать некоторые функции доступными из ctypes?”

gcc кажется, экспортирует функции по умолчанию, вы можете использовать любой PE-просмотрщик, такой как PE Explorer (View> Export), чтобы просмотреть экспортированные функции:

введите описание изображения здесь

Но, если вы попытаетесь скомпилировать этот код с помощью VC ++, он не будет экспортировать эту функцию для вас, вы увидите, что не экспортируется функция:

введите описание изображения здесь

Вам нужно попросить его экспортировать эту функцию:

 __declspec(dllexport) int addition(int a, int b){ return a+b; } 

Что касается вызовов конвенций, правило прост:

Если ваша функция использует __stdcall , как и большинство Win32API, вам нужно импортировать DLL с помощью WinDLL('mylib.dll') или windll.mylib , например:

 > type mylib.c __declspec(dllexport) int __stdcall addition(int a, int b) { return a+b; } *********************************************************************** > cl mylib.c /link /dll /out:mylib.dll Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. mylib.c Microsoft (R) Incremental Linker Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. /out:mylib.exe /dll /out:mylib.dll mylib.obj Creating library mylib.lib and object mylib.exp *********************************************************************** > python >>> from ctypes import * >>> >>> WinDLL('mylib.dll').addition(1, 2) 3 >>> windll.mylib.addition(1, 2) 3 >>> 

Если ваша функция использует __cdecl , ведьма – это соглашение по умолчанию, вы должны импортировать DLL с CDLL('mylib.dll') или cdll.mylib' , например:

 > type mylib.c // `__cdecl` is not needed, since it's the default calling convention __declspec(dllexport) int addition(int a, int b){ return a+b; } *********************************************************************** > cl mylib.c /link /dll /out:mylib.dll Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. mylib.c Microsoft (R) Incremental Linker Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. /out:mylib.exe /dll /out:mylib.dll mylib.obj Creating library mylib.lib and object mylib.exp *********************************************************************** > python >>> from ctypes import * >>> >>> CDLL('mylib.dll').addition(1, 2) 3 >>> cdll.mylib.addition(1, 2) 3 >>> 
  • PythonMagick не может найти мои файлы PDF
  • Печатать на консольном терминале не на выходе ячеек IPython Notebook
  • Установка тензорного потока с анакондой в окнах
  • Как установить pip3 в Windows?
  • Создание установщика Windows для Python + набора зависимостей
  • Что делать с сообщением об ошибке «Слишком длинная строка ввода»?
  • Как создать временный файл, который может быть прочитан подпроцессом?
  • Как очистить консоль интерпретатора?
  • lxml: Ошибка загрузки DLL: указанный модуль не найден
  • pip install -U steem error Windows Kits
  • Использование процессора Python падает до 0%, возобновляется после нажатия клавиши во время выполнения скрипта
  • Python - лучший язык программирования в мире.