Python ctypes ошибка GOMP_critical_end при загрузке библиотеки

У меня есть библиотека, которую я скомпилировал с помощью gcc, используя -fopenmp и ссылку на libmkl_gnu_thread.a.

Когда я пытаюсь загрузить эту библиотеку, используя ctypes, я получаю сообщение об ошибке неопределенный символ: GOMP_critical_end

Компилируя это без openmp и ссылаясь на libmkl_sequential.a вместо gnu_thread, библиотека работает нормально, но я бы предпочел не создавать разные версии для поддержки Python.

Как я могу исправить эту ошибку? Нужно ли собирать python из исходников с поддержкой openmp? Я бы хотел избежать этого, так как пользователи не хотят создавать собственный python для использования этого программного обеспечения.

Я использую python2.7.6.

1 ответ

Решение

Имеющий -fopenmp в то время как компиляция включает поддержку OpenMP и вводит в результирующий объектный файл ссылки на функции из библиотеки поддержки времени выполнения GNU OpenMP libgomp, Затем вы должны связать ваш общий объект (он же общая библиотека) с libgomp для того, чтобы сказать во время выполнения компоновщик также загрузить libgomp (если он еще не загружен через какую-либо другую зависимость) всякий раз, когда ваша библиотека используется для разрешения всех символов.

Ссылка против libgomp может быть сделано двумя способами:

  • Если вы также используете GCC для связывания объектных файлов и создания общего объекта, просто дайте ему -fopenmp флаг.
  • Если вы используете системный компоновщик (обычно это ld), то дайте -lgomp вариант.

Предупреждение во втором случае: если вы используете GCC, который не является системным по умолчанию, например, у вас установлено несколько версий GCC, или вы используете версию, которая поставляется из отдельного пакета, или создали ее самостоятельно, вы должны предоставить правильный путь к libgomp.so что соответствует версии GCC.

Другие вопросы по тегам