создание модуля C ++ MPI для Python, ошибка импорта - PullRequest
0 голосов
/ 03 марта 2011

У меня есть модуль Python, который оборачивает библиотеку C ++. Библиотека использует MPI и скомпилирована с mpicxx. На некоторых машинах все работает отлично, но на других я получаю это:

ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv

Так что есть неопределенный символ из библиотеки MPI. Насколько я могу сказать, mpicxx должен связать все, но это не так. Есть идеи почему?

Ответы [ 3 ]

1 голос
/ 15 марта 2011

Оказывается, ошибка была в том, что загружались неправильные библиотеки. Как вы знаете, в кластере может быть установлено несколько версий MPI, иногда одна и та же версия компилируется несколькими компиляторами. Все они могут иметь одинаковые имена файлов. В моем случае, даже если я скомпилировал, скажем, MPICH GNU, путь по умолчанию был к библиотекам OpenMPI PGI. Я не осознавал этого, я думал, что компиляция с MPICH GNU будет означать, что библиотеки MPICH GNU будут найдены во время выполнения.

Конечно, я не мог использовать OpenMPI, скомпилированный PGI, потому что Python был скомпилирован с GCC, а PGI не создает двоичные файлы, полностью совместимые с GCC.

Решение состоит в том, чтобы установить переменную среды LD_LIBRARY в соответствии с распределением MPI, которое вы использовали для компиляции кода.

0 голосов
/ 18 июня 2012

символ ZN3MPI3Win4FreeEv определен как libmpi_cxx.so, поэтому необходимо связать с -lmpi_cxx вместо -lmpi

0 голосов
/ 03 марта 2011

Это проблема с общей библиотекой. Попробуйте запустить ldd на модуле расширения как в системе, где он работает, так и в системе, где он выходит из строя.

ldd _extension.so

Это должно показать вам все библиотеки, от которых зависит ваше расширение, чтобы вы могли убедиться, что они доступны.

Простой способ обойти это может заключаться в статической привязке зависимостей к вашему расширению.

...