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.