Интерпретатор Python завершает работу при загрузке DLL

#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 . Спасибо!