#c #python #ctypes
#c #python #ctypes
Вопрос:
Я хочу протестировать обертывание dll с ctypes. Я написал следующий тестовый код и скомпилировал его с использованием Code::Blocks и Cygwin в dll.
#define DLL_EXPORT extern "C" __declspec(dllexport)
DLL_EXPORT int sum(int a, int b) {
return a b;
}
Примечание: Это весь код. Может быть, чего-то не хватает?
Теперь я копирую TestDll.dll
на свой рабочий стол и запускаю интерпретатор Python. Но когда я хочу его загрузить, интерпретатор просто завершает работу!
C:UsersniklasDesktop>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> dll = ctypes.WinDLL('TestDll')
C:UsersniklasDesktop>
Однако загрузка любой другой библиотеки работает или выдает ошибку, если библиотека не может быть найдена.
Можете ли вы сказать мне, что я здесь делаю не так?
Использование Cygwin g 3.4.4
Ответ №1:
Проверьте objdump -p TestDll.dll | grep dll
, подключены ли вы «cygwin1.dll » и nm TestDll.dll | grep Dll
чтобы посмотреть, есть ли у вас DllMain
. Следующая команда должна правильно собрать DLL:
g testdll.c -mno-cygwin -shared -o TestDll.dll
Кроме того, вам необходимо использовать CDLL для соглашения о вызове cdecl, а не WinDLL:
>>> import ctypes
>>> dll = ctypes.CDLL('TestDll')
>>> dll.sum(4, 5)
9
Редактировать: я скомпилировал с i686-w64-mingw32-g .exe
(4.5.3) из репозитория Cygwin, но раньше я без проблем использовал Cygwin gcc по умолчанию, учитывая опцию -mno-cygwin.
Комментарии:
1. Йиппи, используя
ctypes.CDLL
, устраняет проблему, возникшую в комментарии к сообщению Игнасиоса. Но использование Cygwin по-прежнему не удается, даже с этими командами. И нет, у dll нетdllmain
. Почему это необходимо? Он работает без него, используя MinGW. 🙂
Ответ №2:
Как полное предположение, я бы сказал, что встроенная в Cygwin DLL несовместима с встроенным в MSVC интерпретатором либо из-за проблемы ABI, либо просто потому, что вы не можете использовать две разные библиотеки. Вместо этого создайте DLL с помощью MinGW.
Комментарии:
1. Лол, вот это забавно ^^. Работает! Ну, в общем. Он больше не завершается! Но
dll.sum
не занимает 8 байт, как ожидалось, он не занимает ни одного. Мне нужно вызвать его без каких-либо аргументов, и он возвращается2620428
. Спасибо!