Python «зависает», когда я пытаюсь импортировать разделяемую библиотеку c ++ в версию python 2.5 для Windows, и я понятия не имею, почему.
В Linux все работает нормально. Мы можем скомпилировать весь наш код C ++, сгенерировать классы оболочки Swig. Они компилируются и могут быть импортированы и использованы в Python 2.5 или 2.6. Теперь мы пытаемся перенести код на Windows с помощью Cygwin.
Мы можем скомпилировать каждую из библиотек C ++ в общие библиотеки с помощью -mno-cygwin, что устраняет зависимость от cygwin1.dll. По сути это приводит к тому, что целью gcc будет CyGwin вместо MinGW, что позволяет запускать полученные двоичные файлы в Windows без какой-либо зависимости от Cygwin. Более того, каждая из этих общих библиотек может быть связана с двоичными файлами c ++ и успешно работать.
Когда это было сделано, мы использовали swig для генерации оболочек для каждой из разделяемых библиотек. Эти оболочки создаются, компилируются и связываются без проблем.
Следующим шагом был импорт сгенерированной оболочки Python в Python. Мы можем импортировать все наши библиотеки, кроме двух. Для двух, которые не работают, когда мы пытаемся импортировать файлы .py или .pyd в Windows Python (версия, скомпилированная с Visual C ++), Python зависает. Мы не можем убить Python с помощью Ctrl + C или Ctrl + D, единственный выход - убить его с помощью диспетчера задач. Если мы присоединяем gdb к процессу python и печатаем трассировку стека, мы в основном получаем мусор, ничего полезного.
Далее мы попытались определить блоки кода в файлах * .i и воссоздать swig-оболочки. Этот процесс, по крайней мере, позволил мне импортировать библиотеки в Windows Python, но проблема в том, что нам пришлось закомментировать слишком много функций, необходимых для работы программного обеспечения. В общем, нужно было закомментировать три типа функций: статические функции, виртуальные const-функции и обычные общедоступные функции, которые НЕ были объявлены как const. Это также воспроизводимо, если мы раскомментируем любую из этих функций, то импорт снова зависает.
Затем мы попытались извлечь функции в простую программу hello world, сгенерировать оболочку swig и импортировать их в python. Это сработало. Мы скопировали функции именно из заголовочных файлов. Они работают в очень маленькой тестовой программе, но не в большой общей библиотеке. Мы строим их точно так же.
Итак, любые идеи о том, почему это происходит, или даже просто о лучших методах отладки, будут очень полезны.
Они отлично работают в Linux с gcc 3 и 4 и python 2.5 и 2.6.
В Windows это программное обеспечение, которое я использую:
gcc 3.4.4
swig 1.39 (двоичные файлы Windows от swig.org)
python 2.5.4 (двоичные файлы Windows и включает / libs из python.org)
Это команды, которые я использую для создания простой программы hello world (полная библиотека использует те же опции, но она намного длиннее из-за дополнительных опций -I, -L и -l)
swig -c ++ -python -o test_wrap.cc test.i
gcc -c -mno-cygwin test.cc
gcc -c -mno-cygwin test_wrap.cc -I / usr / python25 / include
dlltool --export-all --output-def _test.def test.o
gcc -mno-cygwin -shared -s test_wrap.o test.o -L / usr / python25 / libs -lpython25 -lstdc ++ -o _TestModule.pyd
Спасибо,
AJ