устарела ли вся доступная информация о компиляции swig + python + mingw? - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь построить расширение C ++ для python, используя swig. Я следовал приведенным ниже инструкциям, а остальные - букве T и, похоже, не могу загрузить свое расширение.

Я наткнулся на эту статью на сайте MinGW в разделе «Как создать расширения Python?»

http://www.mingw.org/wiki/FAQ

Я также нашел эти уроки:

http://boodebr.org/main/python/build-windows-extensions http://www.mail-archive.com/modwsgi@googlegroups.com/msg04655.html http://oldwiki.mingw.org/index.php/Python%20extensions

Я использую Panda3d-1.7.0 для сборки против - panda на win32 работает под python2.6.4 (MSC v.1500 скомпилирован). Я использую MinGW gcc / g ++ (GCC) 3.4.5 для компиляции.

Я заметил, что когда я запускаю setup.py с помощью следующей команды:

python setup.py build -cmingw32

Сначала запускается gcc.exe, затем g ++. Exe для сборки pyd. g ++ ссылается на: -lpython26 -lmsvcr90

она строит и связывает достаточно хорошо (без ошибок), но когда я копирую файлы _extension.pyd и extension.py в Panda3d-1.7.0 \ python \ Lib \ site-packages и запускаю> python -c "import расширение "из командной строки, Python выводит следующее:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Panda3D-1.7.0\python\Lib\site-packages\extension.py", line 25, in <module>
    _bullet = swig_import_helper()
  File "C:\Panda3D-1.7.0\python\Lib\site-packages\extension.py", line 21, in swig_import_helper
    _mod = imp.load_module('_extension', fp, pathname, description)
ImportError: DLL load failed: The specified module could not be found.

Есть советы или указатели? Спасибо!

кт

1 Ответ

2 голосов
/ 05 октября 2010

Две вещи для проверки:

  • Проверьте DLL библиотеки времени выполнения C, привязанную к вашему питону и к вашей DLL расширения с помощью обходчик зависимостей , чтобы убедиться, что они используют один и тот же CRT. Это распространенный источник проблем при создании расширений для других языков. (Я часто вижу это, например, в Lua) и может вызывать интересные и прерывистые ошибки, которые особенно трудно отследить.

  • IIRC, «официальные» выпуски Python для Windows перешли на Visual Studio Express из MinGW. Это может сделать практически невозможным использование MinGW для создания расширения C ++, которое можно вызывать из Python, скомпилированного и связанного с Visual Studio, из-за непримиримых различий в ABI C ++.

Обе эти рекомендации сводятся к тому, чтобы убедиться, что ABI, который вы предполагаете в своей DLL расширения, соответствует ABI, предполагаемому хост-приложением, и что вы не дублируете основные функциональные блоки, такие как CRT, которые могут содержать или управлять состоянием, которое трудно правильно распределить между экземплярами.

Редактировать: Улучшенное редактирование вопроса убедительно свидетельствует о наличии проблем с несоответствиями между Microsoft C ++ ABI и GCC C ++ ABI, которые , как известно, отличаются .

...